反射究竟是什麼呢,我被問到的時候其實也沒辦法很好的回答這個問題,翻一翻博客,而後逐條講解。今天干脆就整合一下,省得之後還要去翻。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