反射定义:反射机制能够动态的操纵 Java 代码的程序,能够分析类能力的程序。通过编译之后的字节码文件获取类中对象,可以得到类中的所有属性,方法,并且可以动态的操作该类。反射的关键源于 Class 类发挥的作用,该类在 java.lang.Class包下。Class 类java.lang.Class 类的实例对象,任何一个类都是 Classs 实例对象,获取 Class 对象的三种方式我们先定义一个 Student 类,在该类中定义变量和方法class Student{ private String name; public void show(){ System.out.println(“show”); }}然后编写一个测试类,分别测试三种获取 Class 对象的方式第一种方式 Class c_0 = Student.class;,我们知道当运行一段代码第一步是进行编译,Java 程序文件后缀在编译之前 .java 文件,编译之后为 .class 文件,只要编译通过就会生成,第一种方式直接调用 Student 类的字节码文件,获取所需要的对象第二种方式 Class c_1 = student.getClass();,当我已经实例化一个 Student 对象,学习 Object 类知道所有类默认继承 Object 类,在 Object 类下有一个方法可以获取类信息,直接调用即可。第三种方式Class c_2 = null;c_2 = Class.forName(“这里写类的全称”);// 比如 demo.Student测试程序主要代码public class test {public static void main(String[] args) throws ClassNotFoundException { Student student = new Student(); Class c_0 = Student.class; Class c_1 = student.getClass(); Class c_2 = null; c_2 = Class.forName(“demo.Student”); System.out.println(c_0); System.out.println(c_1); System.out.println(c_2); System.out.println(c_0 == c_1); System.out.println(c_0 == c_2); }}打印结果为class demo.Studentclass demo.Studentclass demo.Studenttruetrue先查看 Class 类的三个对象,然后进行比较发现不论属于哪一种方式创建 Class 类创建的对象,他们都属于同一个对象,并没有重新编译生成。获取程序在运行时刻的内部结构只是第一步,我们可以继续挖掘内部结构信息,比如声明定义的方法,变量等,常用的 Class 类下的方法主要有 getConstructor, getField 和 getMethod 分别获取构造方法,获取域还有方法,这里三个方法除了会获取 public 的函数对象,还会获取继承父类的所有元素。相比对应的 getDeclaredConstructor, getDeclaredField, getDeclareMethod这三个方法同样回去构造方法,域还有方法,但是这三个方法只会获取对象本身的方法,不问访问权限。每个方法都有自己的所属类。