首先,要明白反射是什么!
反射:将类的组成部分封装成其他对象。
咋看一眼必然看不懂……咱们来解释解释。
第一个问题:类的组成部分有哪些?
无非就是成员变量、成员方法、构造方法。你说还有静态代码块、代码块之类的?对不起现在请先忽略它们。
好了,反射的意思就是把类的成员变量、成员方法、构造方法封装成其他对象……
这也挺难懂的吧……
再继续深入的解释!
知道类加载吧,就是把编译好的字节码文件加载到JVM等待使用;JVM中,万物皆对象,那么加载进来的字节码文件用什么来存?
一个名字叫做Class的类对象,而字节码文件被编译好的内容(类的成员变量、成员方法、构造方法)用什么来表示呢?
如图:
好了,反射就是成员变量封装成一个Field对象这样子……
反射的好处:
……
class对象的功能。
1.获取成员变量:
Field getField(string name)//获取指定名字的public成员变量
Field[] getFields()//获取所有public成员变量
Field getDeclaredField(string name)获取指定名字的成员变量,不管访问控制符
Field[] getDeclaredFields()
private 修饰的成员变量就算拿到了也不能直接使用……
可以通过Field对象调用一个暴力反射的方法setAccessible(true)来实现访问private变量。
当真要获得一个可以用来操作的成员变量,可以通过field变量的get操作,不过需要将其原来的对象当作参数传给field对。
举个栗子
2.获取构造方法:
Constructor getConstructor(参数的类)
constructor[] getConstructors()
constructor[] getDeclaredConstructors()
constructor getDeclaredConstructors(参数的类)
constructor对象可以调用newInstance(若干参数)来构造一个对象出来,如果是调用无参数的构造方法new一个对象,也可以用更加省事的class对象的newInstance()来实现。