文章目錄
1.動態語言概述
java
,c++
被認爲是傳統意義上的靜態語言,或者說是準動態語言,與之相反的JavaScript
和python
等是動態語言,所謂動態語言,即運行時可以改變解構的語言,java
代碼在書寫時運行前會進行編譯,java的多態和反射支持了java語言的動態性
2.Java反射機制概述
Class
類與java.lang.reflect
類庫一起支持了反射
該包下的Method,Field等類都實現了Member接口,這些類在jvm啓動時創建的,根據這些reflection api
可以獲取任何類的內部信息,並且操作任意對象的內部屬性和方法
3.Class類的理解
我們編寫好一個java文件時,使用javac.exe命令編譯.java文件,生成對應的,class文件,當使用java,exe啓動虛擬機時,通過類加載系統將class文件加載到內存中,在方法區生成代表這個類的唯一class對象,之後所有的對象生成都要根據這個class模板進行創建,這裏的class對象我們稱爲運行時類,是Class類的一個實例,每個加載到內存種的類都是Class類的實例,
3.1獲取Class實例
- 1.類名.class
- 2.創建對象,再通過對象.class
- 3.class.forName(),方法簽名爲全限定類名
3.2獲取運行時類的對象
與傳統new
+構造器方式創建對象不同,通過newInstance()
反射方式也可以創建對象,使用該方法創建對象需要注意:
- 創建的運行時類必須提供空參構造器
- 足夠的訪問權限,一般是public
4.instanceof與Class等價性
在進行類型查詢時,比如:
public class son extends parent{
public static void main(String[] args) {
son s = new son();
System.out.println(s instanceof son);
System.out.println(s instanceof parent);
System.out.println(s.getClass() == sin.class);
System.out.println(s.getClass().equals(sin.class));
System.out.println(s.getClass().equals(parent.class));
}
}
public class parent{}
輸出結果:
true
true
true
true
false
我們可以看出,通過三種方式進行類型校驗,instanceof
更加偏向於:某個類或某個類的子類,而==
或equals
則是:必須是該class對象,沒有考慮繼承關係
5.反射提供的功能及相關api
API: