Java反射
2020-02-28 21:04 默默不语 阅读(231) 评论(0) 编辑 收藏 举报1.Java反射机制
反射是Java语言的特征之一。反射机制是 Java 的动态性之一动态语言,在程序运行时,可以改变程序的结构或变量类型。Java 不是动态语言,但具有一定的动态性,可以称为”准动态语言”,具备类似动态语言的特性。Java的动态性让编程变得更加的灵活,功能就更加的强大。
2.Java反射机制的优点:
①允许在运行时动态加载类
②可以访问私有属性和私有方法
class Animal{ public String name; private int age; double weight; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public Animal() { } public Animal(String name) { this.name = name; } public Animal(String name,int age) { this.name = name; this.age = age; } public Animal(String name,int age,double weight) { this.name = name; this.age = age; this.weight = weight; } }
3.通过反射获取class对象
①使用Object类中的getClass()方法
//这种创建对象的方式为正射 Animal a = new Animal(); Class c3 = a.getClass();
②使用Class类的静态方法forName(String className);
Class c4 = Class.forName("day01.Animal");
③使用class常量。
Class c1 = Animal.class;
4.通过class获取类信息
①获取类的包名:getPackage()
Class c = Class.forName(“day01.Animal”);
System.out.println("获取包:"+c.getPackage().getName());
②获取类的父类:
System.out.println("父类名:"+c.getSuperclass().getName());
③获取类的成员变量:
Field[] getFields() //仅公有的
Field[] getDeclaredFields() //所有的
Class c = Class.forName("day01.Animal"); Object animal = c.newInstance(); //获取对应属性名的field 对象 Field field = c.getDeclaredField("name"); //o代表Animal对象,设置Animal类的属性name的值 field.set(animal, "小狗"); System.out.println(field.get(animal));
④获取类的构造方法
Constructor<?>[] getConstructors()
Constructor<?>[] getDeclaredConstructors()
Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Class c = Class.forName("day01.Animal"); Object o = c.newInstance(); Field f = c.getDeclaredField("age"); //设置是否允许访问私有属性或方法,默认为false,不可访问 f.setAccessible(true); f.set(o, 10); System.out.println(f.get(o)); Constructor c1 = c.getConstructor(); System.out.println(c1); Constructor c2 = c.getConstructor(String.class,int.class); System.out.println(c2);
⑤获取类的成员方法
Method[] getMethods()
Method[] getDeclaredMethods()
Method getMethod(String name, Class<?>... parameterTypes)
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[] m = c.getMethods(); for (Method method : m) { System.out.println(method); } Method m1 = c.getMethod("getAge", null); System.out.println(m1);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!