天天看點

反射

動态語言

是一類在運作時可以改變其結構額語言:例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被删除或者是其他結構上的變化。

主要的動态語言有:C#\、JavaScript、PHP、Python等。

靜态語言

運作時結構不變的語言就是靜态語言

如:Java、C、C++

Java不是動态語言,但Java可以稱為準動态語言。Java有一定的動态性,我們可以利用反射機制獲得類似動态語言的特性。

Reflection(反射)是Java被視為動态語言的關鍵,反射機制允許程式在執行期借助于Reflection API取得任何類的内部資訊,并能直接操作任意對象的内部屬性及方法

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

加載完類之後,在堆記憶體的方法區中就産生了一個Class類型的對象(一個類隻有一個Class對象),這個對象就包含了完整的類的結構資訊。我們可以通過這個對象看到類的結構。這個對象就像一面鏡子,透過鏡子看到類的結構,是以我們形象的稱之為:反射

正常方式:引入需要的"包類"名稱->通過new執行個體化->取得執行個體化對象

反射方式:執行個體化對象->getClass()方法->得到完整的包類名稱

Java反射機制提供的功能

在運作時判斷任意一個對象所屬的類

在運作時構造任意一個類的對象

在運作時判斷任意一個類所具有的成員變量和成員方法

在運作時擷取泛型資訊

在運作時調用任意一個對象的成員變量和方法

在運作時處理注解

生成動态代理

優點:

可以實作動态建立對象和編譯,展現出很大的靈活性

缺點:

對性能有影響,使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼并且它滿足我們的要求。

總結:

一個類在記憶體中隻有一個Class對象

一個類被加載後,類的整個結構都會被封裝在Class對象中。

通過反射的Class.forName("com.cloudcore.pojo.User");方法

繼承Object類,Object類中定義的getClass()方法,此方法被所有子類繼承

public final Class getClass()

此方法的傳回值類型是一個Class類,此類是Java反射的源頭

擷取Class類的執行個體

實體類

測試類

結果:

結果

注意:

不能直接操作私有屬性,我們需要關閉程式的安全檢測,屬性或方法的setAccessible(true)