反射
一,反射机制的定义
指的是可以于运行时加载,探知和使用编译期间完全未知的类.
1,程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;
2,加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。
二,反射有哪些优点与缺点
优点:1,可以降低类与类之间的关系 2,将编译时的检查延迟到运行时
缺点:1,性能效率不高,代码的可维护性差
三,如何使用反射
1,获取反射入口类的三种方式
①,对象的getClass()方法;
Class class1=Object.getClass();
②,类的.class(最安全/性能最好)属性;
Object obj=new Object();
Class class2=obj.class;
③,运用Class.forName(String className)动态加载类,className需要是类的全限定名(最常用).
Class class3=Class.forname(路径);
2,获取成员变量
以上面获取反射的第三种方式为例
①,获取本类所有的成员变量(任意限制)
1,无参,获取的返回类型为Field数组
Field[] fields=class3.getDeclaredFields();
2,有参,获取的返回类型为Field
Field field=class3.getDeclaredField(变量名);
②,获取本类以及父类的public 修饰的成员变量
1,无参,获取的返回类型为Field数组
Field[] fields=class3.getFields();、
2,有参,获取的返回类型为Field
Field field=class3.getField(变量名);
3,获取构造方法
①,获取本类所有的构造方法(任意限制)
1,无参,获取的返回类型为Constructor数组
Constructor[] constructors=class3.getDeclaredConstructors();
2,有参,获取的返回类型为Constructor
Constructor constructor=class3.getDeclaredConstructor(类型.class);
②,获取本类以及父类的public 修饰的构造方法
1,无参,获取的返回类型为Constructor数组
Constructor[] constructors=class3.getConstructors();
2,有参,获取的返回类型为Constructor
Constructor constructor=class3.getConstructor(类型.class);
4,获取成员方法
①,获取本类所有的成员方法(任意限制)
1,无参,获取的返回类型为Method数组
Method[] methods=class3.getDeclaredMethods();
2,有参,获取的返回类型为Method
Method method=class3.getDeclaredMethod(类型.class);
②,获取本类以及父类的public 修饰的成员方法
1,无参,获取的返回类型为Method数组
Method[] methods=class3.getMethods();
2,有参,获取的返回类型为Method
Method method=class3.getMethod(类型.class);
5,以反射的形式创建对象
可以通过构造方法来实例化对象 .newInstance(有参构造传值,无参构造空着即可)
1,属性值的修改
①,获取所需修改变量,同上
②,设置访问权限
field.setAccessible(true);
③,修改属性值
field.set(.newInstance,"内容 ")\
2,方法的调用
①,获取所要调用方法,同上
②,设置访问权限
method.setAccessible(true);
③,调用方法
method.invoke(.newInstance);
网友评论