第124天學習打卡(知識點回顧 反射 Class類)
Reflection
Reflection(反射) 是java被視為動態語言的關鍵,反射機制允許程式在執行期藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內部屬性及方法
Class c = Class.forName("java.lang.String")
載入完類之後,在堆記憶體的方法區中就產生了一個Class型別的物件(一個類只有提供Class物件),這個物件就包含完整的類的結構資訊。我們可以通過這個物件看到類的結構。這個物件就像一面鏡子,透過這個鏡子看到類的結構,所以 稱之為反射。
正常方式:引入需要的“包類名稱”--->通過new例項化--->取得例項化物件
反射放射:例項化物件--->getClass()方法--->得到完整的“包類”名稱
反射機制提供的功能
-
在執行時判斷任意一個物件所屬 的類
-
在執行時構造任意一個類的物件
-
在執行時判斷一個類所具有的成員變數和方法
-
在執行時獲取泛型資訊
-
在執行時呼叫任意一個物件的成員變數和方法
-
在執行時處理註解
-
生成動態代理
。。。。。
反射優點和缺點
優點:
-
可以實現動態建立物件和編譯,體現出很大的靈活性
缺點:
-
對效能有影響。使用反射基本上是一種解釋操作,我們可以直接告訴JVM。我們希望做什麼並且它滿足我們的要求。這類操作總是慢於直接執行相同的操作。
一個類在記憶體中只有一個class物件
一個類被載入後,類的整體結構都會被封裝在Class物件中
Class類
物件照鏡子後可以得到資訊:某個類的屬性、方法和構造器、某個類到底實現了哪些介面。
-
Class本身也是一個類
-
Class物件只能由系統建立物件
-
一個載入的類在JVM中只會有一個Class例項
-
一個Class物件對應的是一個載入到JVM中的一個.class檔案
-
每個類的例項都會記得自己是由哪個Class例項所生成
-
通過Class可以完整地得到一個類中的所有被載入的結構
-
Class類是一個Reflection的根源,針對任意你想動態載入,執行的類,唯有先獲得相應的Class物件
獲取Class類的例項
-
若已知具體的類,通過class屬性獲取,該方法最為安全可靠,程式效能最高
-
已知某個類的例項,呼叫該例項的getClass()方法獲取Class物件
-
已知一個類的全類名,且該類在類路徑下,可通過Class類的靜態方法forName()獲取,可能丟擲ClassNotFoundException
-
內建基本資料型別可以直接使用.Type
-
還可以利用ClassLoader
B站學習網址: