这篇文章是我在论坛回答一个帖子时写的,这里再细述下。所谓的反射就是,把一个类中的字段(变量)、方法、构造函数等,给它取出来再放到一个个类中
举个例子:
public class Animal
{
//字段
private String name;
private String address;
private int age;
private int id;
private boolean sex;
........
//构造函数
Animal(int age,String name,boolean sex){//具体实现省略}
Animal(int age,int id,boolean sex){//具体实现省略}
Animal(int age,String address,boolean sex){//具体实现省略}
Animal(int age,String name,int id){//具体实现省略}
.................
//方法
public void method1(int x,int y){//具体实现省略}
public int method1(String a,int b){//具体实现省略}
public String method1(boolean zz,String vv){//具体实现省略}
public boolean method1(){//具体实现省略}
public double method1(int www){//具体实现省略}
..........
}
上面这个类有很多方法
那么可以用 Concustor 这个类表示 Animal 这个类中的所有构造函数
那么可以用 Method 这个类表示 Animal 这个类中的所有普通方法
那么可以用 Field 这个类表示 Animal 这个类中的所有字段
就是说把一个类中的共有属性抽出来,再放到一个类中!
最后说了,要先理解字节码和Class这个类
字节码:
用eclipse等软件编写的.java文件叫源文件,一点击保存(其实就调用了javac.exe)eclipse就编译了.java文件------>生成.class文件
当你运行的时候是这样的(java.exe----->JVM------>将.class文件翻译成字节码文件,这时候一个.class文件的字节码就加载到了计算机的内存中了)
图解一下

Class类:
人(Person)是一个类
汽车(Car)是一个类
植物(Plant)是一个类
............................
那么人、汽车、植物.............是不是也是也可以归为一个类来管理呢
这个类就是Class类
接着人啊、汽车啊、植物啊.............每个类中里面是不是有字段、构造方法、普通方法.....................那么他们是不是也可以归为一个类呢
Field-------->对应每个类的字段(例如Person中name、age、address......)
Constructor------>对应每个类中的构造函数
Method------>对应每个类的普通方法
xxx-------->对应每个类的xxx
怎么把一个类中的字段、构造函数、方法抽取出来放到Field、Constructor、Method里面呢?
这就用到了反射了!!!!嗯!!!
每个.class文件(Person.class)加载到JVM的时候在内存中都有一个字节码文件:(给它取个名字,是Class的引用)
Class person=Person.class(这里获得字节码有三种方式,具体看图)
这时就可以用person这个对象调用Class这个类中的方法了
什么person.getConstructor(参数.....)------->获取到Person类的一个构造函数,引用类型是Constructor
什么person.getField(参数......);--------->获取Person类的某一个字段,引用类型是Field
什么person.getMethod(参数......)--------->获取Person类的某一个普通方法,引用类型是Method
又或者,你想取出这个类中所有的构造方法、字段、普通方法:
Constructor[] constructors=person.getConstructors();
Field[] fields=person.getFields();
Method[] methods=person.getMethods();
然后在用for循环的方式,对constructors、fields、methods进行遍历。
这篇文章是怎么具体使用反射: JAVA高新技术反射机制的原理之构造函数、普通方法和字段