Java學習筆記系列-反射

反射的本質

  1. Java在運行時可以得到或判斷某個對象的類型信息
  2. RTTI有一條前提就是某個對象的類型信息在編譯時必須已知。RTTI的實質就是編譯器在遍歷檢查代碼時偷偷將類型信息記錄下來並存儲,以在運行時可以得到當編寫完某個.java文件,並編譯以後,就會產生一個Class對象,由編譯器偷偷的把這個class對象保存在編譯後的.class文件中,當這個.class文件被加載到內存以後,隨之會在內存中建立這個Class對象了。因此,得到class對象的前提是能得到類編譯後的.class文件。且class對象的功能強大,方法衆多:Class.getInterfaces()、Class.getSuperclass()、Class.getName()、Class.isInterface()等等,能用來得到不少信息
  3. RTTI與反射在最底層的思想上是很相似的,本質的區別在於:對RRTI,編譯器在編譯時打開和檢查.class文件,而對反射來講,.class文件在編譯時是不可獲取的,在運行時未知對象已經來了再去打開和檢查.class文件
  4. 反射機制使得java可以建立一個在編譯時徹底未知的對象。反射在Java中用來支持其餘特性的,例如對象的序列化和JavaBean

Class對象

Class對象是進行反射操做的入口,因此首先必須得到Class對象。除了經過實例獲取外,Class對象主要由如下幾種方法得到:java

  • 經過類加載器加載class文件
Class<?> clazz = Thread.currentThread().getContextClassLoader().
        loadClass("com.takumiCX.reflect.ClassTest");
  • 經過靜態方法Class.forName()獲取,須要傳入類的全限定名字符串做參數(在得到class對象的同時會引發類的初始化;若是指定參數initialize爲false時,也不會觸發類初始化,其實這個參數是告訴虛擬機,是否要對類進行初始化)
Class<?> clazz = Class.forName("com.takumiCX.reflect.ClassTest");
  • 經過類.class得到類的Class對象
Class<ClassTest> clazz = ClassTest.class;

Spring IOC反射機制

  1. 找到並加裝配置
  2. 解析配置文件中的bean元素,並識別id和class
  3. 經過反射(Class.forName().newInstance())建立這個bean的實例
  4. 將id做爲key、實例做爲value存放進Spring容器中
  5. getBean取出實例
相關文章
相關標籤/搜索