在反射中如果不使用强制获取私有的方法,无论是再获取成员变量还是方法的时候获取被public修饰的
反射首先获取构造,在获取构造之后才可以获取成员的方法
在java的反射机制都是在运行状态中的,对于任意一个类,都可以知道这个类的所有方法和属性(包括私有),对于人一个类,都能够调用他的任意一个属性和方法,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
如果想要解刨一个类,首先必须获取到该类的字节码文件对象,而解刨使用的就是class类中的方法,所以先要获取每个字节码文件对应的class 类型的对象
反射使用的三种方式(获取类对象的三种方式)
1,创建对象的形式获取类对象 new Student().getClass()
2,直接类名点calss 获取类对象 Student.class
3,根据类的全路径,进行获取类对象 Class.forName("类的全路径")
反射获取构造方法并使用
通过反射获取构造方法并使用
Construcotr <?> [] getConstructors() 获取全部都是都public 修饰的构造方法
Construcotr <?> [] getConstructors(Class<?> ... paramenterType) 获取时可以传入指定的字节码文件,获取有参数的构造
Class 类中的 T newInstance() 方法,在创建一个没空参数的实例对象
Constructor 类中的 newInstance()方法,是在获取参数的时候,看传入的参数列表,如果参数列表中有数据,则newInstance() 方法中也需要传入参数
下面总结一下反射的使用步骤:
1,首先获取该类的字节码文件对象
在获取该类的字节码文件的时候,有三种方式进行获取上面已经介绍到
2,获取该类中的构造方法(的对象)
Constructor <?> [] getConstructors(): 查看字节码对象中有哪些构造方法,然后通过getConstructor(Class <?> ... parametType),回去有参数的字节码对象,在这一步只是获取到字节码对象还没有真正的创建对象
3,通过根据构造获取的字节码对象,从而进行实例化对象
在根据构造方法获取的字节码对象,返回Constructor 对象,该对象中有newInstance(Object ...obj ) 的方法,该方法中的参数根据第二步中使用构造获取字节码对象时传递的参数的类型的字节码的参数类型和个数,进行传值,从而实例化该对象
通过反射获取成员变量并使用
在获取的时候,分只获取公共的成员变量和全部的成员变量
公共的成员变量
Field [] getFidlds() 获取所有的公共的成员变量
Field getField(String name) : 根据指定的字段名称(成员变量的名称),获取对应的字段对象,但是只能获取public 修饰的
全部的成员变量(包括私有)
Field [] getDeclaredFields() 获取所有的成员变量(字段名称)
Field getDeclarredField(String name ): 根据指定的字段名称(成员变量名),获取对应的字段对象,
强制获取私有的属性
1:获取该类的字节码文件对象
2: 有该类的字节码文件对象,产生一个实例(没有参数)
3: 通过该类的字节码对象,获取指定的字段(字段名称)
4:如果是非public的字段,可以通过getDeclaredField() 获取非public的字段强制获取
5: 去除 public 的权限,使用setAccessable(true) 方法,将public的修饰去掉
6: 对成员变量操作,无论是获取还是修改,只有上面将权限去除掉才可以使用
只有在get和set的时候需要将权限消除
通过反射获取成方法并使用
在获取的时候参数列表中只能传入类型的字节码对象
Method[] getMethods() ;返回所有非私有的方法名
Method getMethod(Stirng name,Class<?> .. . paramterType):返回非私有的并且指定参数的方法:拿着传入的参数的类型去字节码对象中中寻找,有匹配的返回Method对象
Method[] getDeclaredMethods()返回所有的方法包括私有,但是不返回继承的方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回指定参数的方法包括私有的,就是拿着方法名和参数列表去字节码对象中查找
在上面的操作中,只能传入形参,如果要传入实参,需要下面的方法(就是操作具体的方法,跟上面操作构造函数一般)
Object invoe (Object obj ,Object ...args),将制定的数据传入指定的方法中(实参)、
Obj 表示,对象在传入之前的时候,需要指定要把值给那个对象中的方法,
操作方法的步骤:
1: 获取字节码对象
2:获取实例化对象
3:通过字节码文件的对象获取Method对象,这一步只是 反射阶段,可变参数的数据类型字节码文件对象
4; 执行方法,将数据写入,通过Method 对象去调用invoke (实例化对象代表该方法是那个duixiang中的方法,具体的实际操作)返回Object