Reflection in Java
反射到底是什么呢,我被问到的时候其实也没办法很好的回答这个问题,翻一翻博客,然后逐条讲解。今天干脆就整合一下,免得以后还要去翻。
首先讲一下Java是如何在运行时识别对象和类的信息,有两种方式,RTTI和反射,RTTI假设我们已经知道了所有的类型信息,反射让我们在运行过程中使用这些信息(尤其是私有的属性
1、RTTI
class对象
RTTI是如何在Java中工作的呢,这些类型信息如何在运行时表示?这是由Class对象来完成的,顾名思义,它包含了所有和Class相关的信息。Java会使用class对象来执行RTTI,即使你正在执行的时类型转换这类的工作。
每个Class都会产生一个class对象,保存在.class文件。(这样我们知道其实class对象是编译后的产物)所有的类都是在对其第一次使用的时候,动态加载到JVM的,但程序创造一个对静态成员的引用的时候,就会加载这个类。class对象只会在需要它的时候才会加载,而static初始化是在类加载时进行的。
public class TestMain {
Public static void main(String [] args) {
System.out.println(A.name);
}
}
class A {
public static String name="Alice";
static {
System.ouut.print("A静态块");
}
pulic A(){
System.out.println("A构造了")
}
}
类加载器会检查这个类的Class对象是否已经被加载过,如果没有,就会根据类名来找到对应的.class文件。
什么是反射?
说了那么多有的没的,到底什么是反射呢
对于任何一个类,我们都能知道这个类会有那些方法和属性。对于任何一个对象,我们能知道,可以调用它的方法和属性。这种动态获取对象信息和调用对象方法的过程叫做Reflection
所谓的反射,也就是获取类的字节码(.class文件),通过class对象获取
反射的三种形式
使用getClass来获取此Object的运行时类
Test t = new Test();//对象创建
Class c = t.getClass();//获取Class对象
System.out.println(c.getName());//打印名称
直接.class
Class c = Test.Class;
Class.forName()这个在数据库操作里面用的很多了
try {
Class c = Class.forName("com.jhin.Test");
System.out.print(c.getName());
} catch (ClassNotFoundExcetion e){
e.printStackTrace();
}
一般我们选用Class.forName
参考:
《Java编程思想》
Java重点基础:反射机制 https://baijiahao.baidu.com/s?id=1619748187138646880&wfr=spider&for=pc