1. 程式人生 > 其它 >第124天學習打卡(知識點回顧 反射 Class類)

第124天學習打卡(知識點回顧 反射 Class類)

反射

Reflection

Reflection(反射) 是java被視為動態語言的關鍵,反射機制允許程式在執行期藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內部屬性及方法

Class c = Class.forName("java.lang.String")

載入完類之後,在堆記憶體的方法區中就產生了一個Class型別的物件(一個類只有提供Class物件),這個物件就包含完整的類的結構資訊。我們可以通過這個物件看到類的結構。這個物件就像一面鏡子,透過這個鏡子看到類的結構,所以 稱之為反射。

正常方式:引入需要的“包類名稱”--->通過new例項化--->取得例項化物件

反射放射:例項化物件--->getClass()方法--->得到完整的“包類”名稱

反射機制提供的功能

  • 在執行時判斷任意一個物件所屬 的類

  • 在執行時構造任意一個類的物件

  • 在執行時判斷一個類所具有的成員變數和方法

  • 在執行時獲取泛型資訊

  • 在執行時呼叫任意一個物件的成員變數和方法

  • 在執行時處理註解

  • 生成動態代理

。。。。。

反射優點和缺點

優點:

  • 可以實現動態建立物件和編譯,體現出很大的靈活性

缺點:

  • 對效能有影響。使用反射基本上是一種解釋操作,我們可以直接告訴JVM。我們希望做什麼並且它滿足我們的要求。這類操作總是慢於直接執行相同的操作。

一個類在記憶體中只有一個class物件

一個類被載入後,類的整體結構都會被封裝在Class物件中

Class類

物件照鏡子後可以得到資訊:某個類的屬性、方法和構造器、某個類到底實現了哪些介面。

對於每個類而言,JRE都為其保留一個不變的Class型別的物件。一個Class物件包含了特定某個結構(class/interface/enum/annotation/primitive type/void/[])的有關資訊。

  • Class本身也是一個類

  • Class物件只能由系統建立物件

  • 一個載入的類在JVM中只會有一個Class例項

  • 一個Class物件對應的是一個載入到JVM中的一個.class檔案

  • 每個類的例項都會記得自己是由哪個Class例項所生成

  • 通過Class可以完整地得到一個類中的所有被載入的結構

  • Class類是一個Reflection的根源,針對任意你想動態載入,執行的類,唯有先獲得相應的Class物件

獲取Class類的例項

  • 若已知具體的類,通過class屬性獲取,該方法最為安全可靠,程式效能最高

  • 已知某個類的例項,呼叫該例項的getClass()方法獲取Class物件

  • 已知一個類的全類名,且該類在類路徑下,可通過Class類的靜態方法forName()獲取,可能丟擲ClassNotFoundException

  • 內建基本資料型別可以直接使用.Type

  • 還可以利用ClassLoader

B站學習網址:【狂神說Java】註解和反射嗶哩嗶哩bilibili