乐趣区

Java-基础-反射

反射
定义:反射机制能够动态的操纵 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.Student
class demo.Student
class demo.Student
true
true
先查看 Class 类的三个对象,然后进行比较发现不论属于哪一种方式创建 Class 类创建的对象,他们都属于同一个对象,并没有重新编译生成。
获取程序在运行时刻的内部结构只是第一步,我们可以继续挖掘内部结构信息,比如声明定义的方法,变量等,常用的 Class 类下的方法主要有 getConstructor, getField 和 getMethod 分别获取构造方法,获取域还有方法,这里三个方法除了会获取 public 的函数对象,还会获取继承父类的所有元素。相比对应的 getDeclaredConstructor, getDeclaredField, getDeclareMethod 这三个方法同样回去构造方法,域还有方法,但是这三个方法只会获取对象本身的方法,不问访问权限。每个方法都有自己的所属类。

退出移动版