更新時間:2020-04-15 13:56:39 來源:動力節點 瀏覽2404次
1.背景:spring中大量使用了Java的反射特性進行IOC,有必要了解Java反射機制
2.基本概念:反射是Java語言的一個特性,允許程序在運行時進行自我檢查和內部成員的操作。如下代碼
3.反射的優點與缺點:反射是一種動態編譯(在運行時確定類型,綁定對象),與之對應的是靜態編譯(在編譯時確定類型,綁定對象)。反射能發揮Java的靈活性,降低類之間的耦合性。在JavaEE編程中經常用到,尤其Spring的IOC就是使用了Java的發射這一特性。雖然反射能很好的發揮Java的靈活性,但這也是以犧牲一部分性能為代價的。
4.反射常用的API
(1)獲取class對象
在JavaAPI中,獲取Class類對象有三種方法:
第一種,使用Class.forName靜態方法。當你知道該類的全路徑名時,你可以使用該方法獲取Class類對象。如下例子
Classclz=Class.forName("java.lang.String");
第二種,使用.class方法。
這種方法只適合在編譯前就知道操作的Class。如下例子
Classclz=String.class;
第三種,使用類對象的getClass()方法。如下例子
Stringstr=newString("tony");
Classclz=str.getClass();
(2)通過反射創建類對象
通過反射創建類對象主要有兩種方式:通過Class對象的newInstance()方法、通過Constructor對象的newInstance()方法。
第一種:通過Class對象的newInstance()方法。如下例子
Classclz=User.class;
Useruser=(User)clz.newInstance();
第二種:通過Constructor對象的newInstance()方法。如下例子
Classclz=User.class;
Constructorconstructor=clz.getConstructor();
Useruser=(User)constructor.newInstance();
通過Constructor對象創建類對象可以選擇特定構造方法,而通過Class對象則只能使用默認的無參數構造方法。下面的代碼就調用了一個有參數的構造方法進行了類對象的初始化。如下
Classclz=User.class;
Constructorconstructor=clz.getConstructor(String.class,int.class);
Useruser=(User)constructor.newInstance("tony",18);
(3)通過反射獲取屬性、方法、構造器等
我們通過Class對象的getFields()方法可以獲取Class類的屬性,但無法獲取私有屬性。而如果使用Class對象的getDeclaredFields()方法則可以獲取包括私有屬性在內的所有屬性。
以上就是動力節點java培訓機構的小編針對“Java基礎學習:Java反射機制學習”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習