反射究竟是什么呢,我被问到的时候其实也没办法很好的回答这个问题,翻一翻博客,而后逐条讲解。今天干脆就整合一下,省得之后还要去翻。java
首先讲一下Java是如何在运行时识别对象和类的信息,有两种方式,RTTI和反射,RTTI假设咱们已经知道了全部的类型信息,反射让咱们在运行过程当中使用这些信息(尤为是私有的属性数据库
class对象编程
RTTI是如何在Java中工做的呢,这些类型信息如何在运行时表示?这是由Class对象来完成的,顾名思义,它包含了全部和Class相关的信息。Java会使用class对象来执行RTTI,即便你正在执行的时类型转换这类的工做。ide
每一个Class都会产生一个class对象,保存在.class文件。(这样咱们知道其实class对象是编译后的产物)全部的类都是在对其第一次使用的时候,动态加载到JVM的,但程序创造一个对静态成员的引用的时候,就会加载这个类。class对象只会在须要它的时候才会加载,而static初始化是在类加载时进行的。code
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文件。对象
说了那么多有的没的,到底什么是反射呢get
对于任何一个类,咱们都能知道这个类会有那些方法和属性。对于任何一个对象,咱们能知道,能够调用它的方法和属性。这种动态获取对象信息和调用对象方法的过程叫作Reflection博客
所谓的反射,也就是获取类的字节码(.class文件),经过class对象获取io
使用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