咱們要了解反射,首先就要了解 Class 這個類。接下來就先來了解一下Class類吧!html
Class 類的實例表示一個正在運行的 Java 應用程序的類和接口。例如:枚舉是一種類,註釋是一種接口。每一個數組屬於被映射爲 Class 類型的實例(對象)建立的一個類,全部具備相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示爲 Class 對象。java
Class 沒有公共構造方法。Class 對象是在類加載時由 Java 虛擬機以及經過調用類加載器中的 defineClass 方法自動構造的。咱們能夠經過這個Class 類型的對象來進行獲得一些信息:某個類的數據成員名、方法和構造器、某個類到底實現了哪些接口。bootstrap
對於上面說這麼多總結而言,就是下面的幾句話:數組
對於每一個類而言:安全
① 、JRE 都爲其保留一個不變的 Class 類型的對象。一個 Class 對象包含了特定某個類的有關信息。ide
② 、Class 對象只能由系統創建對象。函數
③ 、一個類在 JVM 中只會有一個Class實例 每一個類的實例都會記得本身是由哪一個 Class 實例所生成。性能
①、經過 class 屬性來進行獲取 Class 類對象,該方法最爲安全可靠,程序性能更高。this
如 :Class clzz = String.classspa
②、經過對象的getClass()來進行獲取 Class類對象。這種方式最爲少用。
如:String str = new String(); Class clazz = str.getClass();
③、經過 Class 類的靜態方法 forName() 來進行獲取 Class類對象。這種方式最爲經常使用。
如 :Class clazz = Class.forName(「java.lang.String」);
Class類的經常使用方法
方法名 |
功能說明 |
static Class forName(String name) |
返回指定類名 name 的 Class 對象 |
Object newInstance() |
調用缺省構造函數,返回該Class對象的一個對象(實例) |
Object newInstance(Object []args) |
調用當前格式構造函數,返回該Class對象的一個對象(實例) |
getName() |
返回此Class對象所表示的實體 (類、接口、數組類、基本類型或void)名稱 |
Class getSuperClass() |
返回當前Class對象的父類的Class對象 |
Class [] getInterfaces() |
獲取當前Class對象的接口 |
ClassLoader getClassLoader() |
返回該類的類加載器 |
Class getSuperclass() |
返回表示此Class所表示的實體的超類的Class |
類裝載器是用來把類(class)裝載進 JVM 的。JVM 規範定義了兩種類型的類裝載器:啓動類裝載器(bootstrap)和用戶自定義裝載器(user-defined class loader)。 JVM在運行時會產生3個類加載器組成的初始化加載器層次結構 ,以下圖所示:
相關代碼:
1 public void getClassLoaderName() { 2 3 // 獲取一個系統類加載。(這裏是獲取的是當前類的類加載器)。 4 5 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); 6 7 System.out.println(systemClassLoader); 8 9 // 獲取一個系統類加載的父類加載器擴展類加載器。 10 11 ClassLoader extensionClassLoader = systemClassLoader.getParent(); 12 13 System.out.println(extensionClassLoader); 14 15 // 獲取一個擴展類加載器的父類加載器引導類加載器。 16 17 ClassLoader classLoader = extensionClassLoader.getParent(); 18 19 System.out.println(classLoader); 20 21 }
調用該方法後的執行結果:
經過系統類加載器獲取 classpath 下的資源:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");
System.out.println(in);
那麼接下來就來講一下反射(Reflection):參見地址 http://www.cnblogs.com/Vincent-NMT/p/6083106.html中的內容。