淺談Java反射機制 之 獲取類的字節碼文件 Class.forName("全路徑名") 、getClass()、class


先貼上Java反射機制的概念:

  JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;

對於任意一個對象,都能夠調用它的任意一個方法和屬性;

  這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

  這么一講很強大有沒有!

  反射的機制的實現還有仰仗Class類,因為想要剖析一個類就必須先要獲取到該類的字節碼文件對象,而Class類用於表示.class文件(字節碼)

  而且從獲取到剖析使用的都是Class類的方法。

獲取類字節碼方法有三種:

1、通過實例化對象的 stu.getClass() 獲取到字節碼文件

getClass()方法其實是Object的一個方法,Class繼承了Object,所以我們可以直接使用。

public class Test01 {
    
    public static void main(String[] args) {
        Student stu=new Student();
        Class c=stu.getClass();
        System.out.println(c.getName());
    }
}

結果:com.reflection.model.Student

當然這種方法沒什么意義,因為我們都 new 實例化對象了,就沒有必要反射了。

2、通過類的 .class 屬性獲取類的字節碼文件

import com.reflection.model.Student;
public class Test02 {
    public static void main(String[] args) {
        Class c= Student.class;
        System.out.println(c.getName());
    }
}

結果:com.reflection.model.Student

這種方法比第一種方法稍好,當也有不足之處,因為需要導入類的包,這樣做依賴性太強,不利於解耦。

3、通過類的全路徑名獲取Class對象 使用Class.forName("全路徑名")來實現

此處可能會報出 ClassNotFoundException 異常因為 你給的全路徑名可能不存在,因此給他加一個try{}cath(){}

public class Test03 {
    public static void main(String[] args) {
        try {
            Class c=Class.forName("com.reflection.model.Student");
            System.out.println(c.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

結果:com.reflection.model.Student

比較前兩個方法我們可以看出第三種方法才是我們需要的。

雖然這里用是  全路徑名 輸出的結果也是 全路徑名,但取到的是一個 類的字節碼文件,可以用它做很多事。

下一篇將會講到  :獲取 類 的 方法 和 屬性(包括構造函數)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM