一、概念
反射是框架设计的灵魂,只有学好了反射,才能设计好的框架。关键字是Reflection,反射非常强大,它可以在运行时,获取一个类的所有属性和方法,包括类的私有属性。这种动态获取信息以及动态调用对象方法的功能就是java语言的反射机制。
反射的常用对象:
1.Class:Class类的实例表示正在运行的Java应用程序中的类和接口.
2.Constructor:关于类的单个构造方法的信息以及对它的访问权限.
3.Field :提供有关类或接口的单个字段的信息,以及对它的动态访问权限.
4.Method :提供关于类或接口上单独某个方法的信息.
二、反射用到的API
1.Java中java.lang.Class类用于表示一个类的字节码(.class)文件,获取字节码文件的方法:
a)已知类和对象的情况下 类名.class 对象.getClass()
b)未知类和对象的情况下 Class.forName(“包名.类名”)
2.常用方法:
a)获取包名 类名
clazz.getPackage().getName()//包名
clazz.getSimpleName()//类名
clazz.getName()//完整类名
b)获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量
getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量
getField(变量名)
getDeclaredField(变量名)
c)获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(int.class,String.class)
d)获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名,int.class,String.class)
e)反射新建实例
clazz.newInstance();//执行无参构造创建对象
clazz.newInstance(666,”海绵宝宝”);//执行含参构造创建对象
clazz.getConstructor(int.class,String.class)//获取构造方法
f)反射调用成员变量
clazz.getDeclaredField(变量名);//获取变量
clazz.setAccessible(true);//使私有成员允许访问
f.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
f.get(实例);//访问指定实例变量的值,静态变量,第一参数给null
g)反射调用成员方法
Method m = Clazz.getDeclaredMethod(方法名,参数类型列表);
m.setAccessible(true);//使私有方法允许被调用
m.invoke(实例,参数数据);//让指定实例来执行该方法
三、其他
1.单元测试方法:是java测试的最小单位,使用灵活,推荐使用,通常在没有返回值,没有参数,公共的方法前面加@Test 语法要求: @Test + void + 没有参数 + public
2.获取字节码文件之后,将其储存在Class类型的一个泛型里面,例如:Class student2 = Student.class;
3.暴力反射:关键字是:Declared,可以获取字节码文件的私有属性或者私有方法,和反射的方法类似,就是在方法中间加Declared,一般获取属性和方法之后,都需要赋予权利才可以使用,方法为:field.setAccessible(true);