動态語言
是一類在運作時可以改變其結構額語言:例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被删除或者是其他結構上的變化。
主要的動态語言有: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)