1.動態語言
程式在運行的時候,可以改變程式結構或變數型別,
典型的語言:Python,ruby,javascript等
例:javascript代碼:
function test(){
var s="var a=3;var b=5;alert(a+b);":
eval(s);
}
c,c++,java不是動態語言,java是“準動態語言”,
但是java有一定的動態性,我們可以利用反射機制,位元組碼的操作獲得類似動態語言的特性
java的動態性讓編程更加靈活
2.反射機制介紹(reflection)
指的是可以運行時加載,探知,使用編譯期間完全未知的類
程式在運行狀態中,可以動態加載一個只有名稱的類
對于任意一個已加載的類,都能夠知道這個類的所有屬性和方法;
對于任意一個物件,都能夠呼叫他的任意方法和屬性
Class c =Class.forName(“”);
加載完類之后,在堆記憶體中,產生一個Class型別的物件(一個類只有一個Class物件)
這個物件就包含了完整的類的結構資訊,我們可以通過這個物件看到類的結構,
這個物件就像一面鏡子,透過鏡子看到類的結構,稱位反射,
例:

注:java.lang.Class類十分特殊,用來表示java中的型別本身
Class類的物件包含了某個加載類的結構,一個被加載的類對應一個Class物件
當一個Class被加載,或當加載器(class loader)的defineClass()被JVM呼叫,JVM便自動產生一個Class物件
Class類是反射的根本,任何想動態加載、運行的類,唯有先獲得相應的Class物件
3.獲取Class類物件的方法
1.getClass()
2.Class.forName()
3..class語法
例;

4.反射機制的性能
setAccessible提高反射性能
用法:
1.啟用和禁用訪問安全檢查的開關,值為true則指示反射的物件在使用時應該取消java語言訪問檢查
值為false則指示反射的物件應該實施java語言訪問檢查,并不是為true就能訪問,為false就不能訪問
2.禁止安全檢查,可以提高反射的運行速度
5.反射機制的常見作用
1.動態加載類、動態獲取類的資訊(屬性、方法、構造器)

2.動態構造物件
3.動態呼叫類和物件的任意方法、構造器
4.動態呼叫和處理屬性

5.獲取泛型資訊
java中采用泛型擦除機制來引入泛型,java中泛型只給編譯器看,確保資料安全型和免去強制型別轉換的麻煩
一旦編譯完成,所有泛型有關的型別全部擦除,而反射操作的是加載好的類,看不泛型,
為了通過反射操作此型別以迎合實際開發需求,java新增了ParameterizedType,GenericArrayType
TypeVariable和WildcardType幾種型別來代表不能被歸一到Class類中的的型別但是又和原始型別齊名的型別
ParameterizedType:表示一種引數化的型別,比如Collection<String>
GenericArrayType:表示一種元素型別是引數化型別或者型別變數的陣列型別
TypeVariable:是各種型別變數的公共父介面
WildcardType:代表一種通配符型別運算式

6.處理注解
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110706.html
標籤:Java
