java-反射與Class

1.動態語言概述

javac++被認爲是傳統意義上的靜態語言,或者說是準動態語言,與之相反的JavaScriptpython等是動態語言,所謂動態語言,即運行時可以改變解構的語言,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:
在這裏插入圖片描述

6,反射的應用:動態代理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章