反射的本質
- Java在運行時能夠獲得或判斷某個對象的類型信息
- RTTI有一條前提就是某個對象的類型信息在編譯時必須已知。RTTI的實質就是編譯器在遍歷檢查代碼時偷偷將類型信息記錄下來並存儲,以在運行時能夠獲得當編寫完某個.java文件,並編譯之後,就會產生一個Class對象,由編譯器偷偷的把這個class對象保存在編譯後的.class文件中,當這個.class文件被加載到內存之後,隨之會在內存中創建這個Class對象了。所以,獲得class對象的前提是能獲得類編譯後的.class文件。且class對象的功能強大,方法衆多:Class.getInterfaces()、Class.getSuperclass()、Class.getName()、Class.isInterface()等等,能用來獲得很多信息
- RTTI與反射在最底層的思想上是很類似的,本質的區別在於:對RRTI,編譯器在編譯時打開和檢查.class文件,而對反射來說,.class文件在編譯時是不可獲取的,在運行時未知對象已經來了再去打開和檢查.class文件
- 反射機制使得java能夠創建一個在編譯時完全未知的對象。反射在Java中用來支持其他特性的,例如對象的序列化和JavaBean
Class對象
Class對象是進行反射操作的入口,所以首先必須獲得Class對象。除了通過實例獲取外,Class對象主要由以下幾種方法獲得:
- 通過類加載器加載class文件
Class<?> clazz = Thread.currentThread().getContextClassLoader().
loadClass("com.takumiCX.reflect.ClassTest");
- 通過靜態方法Class.forName()獲取,需要傳入類的全限定名字符串作參數(在獲得class對象的同時會引起類的初始化)
Class<?> clazz = Class.forName("com.takumiCX.reflect.ClassTest");
- 通過類.class獲得類的Class對象
請輸入代碼