java反射的原理及使用

定義

       JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。——百度百科html

原理

什麼是Class對象

    每個java類都對應着一個Class對象,程序編譯階段Class類對象被變成字節碼文件存放於類路徑下(即.class文件),當java類第一次被裝載時jvm會建立該類的Class對象。Class類對象中包含着該類的所有信息,包括變量、方法等。java

類的加載原理

    jvm啓動時,並不是一次性將全部能識別的類所有都加載到內存中,實際上類的加載時機是在該類第一次被使用時被加載的。使用一個類時的大體的加載流程以下:jvm

              類的空間分配:指分配靜態常量成員的空間ide

              類初始化:對靜態常量成員進行初始化及靜態代碼塊的執行,若有超類,先對超類初始化spa

 

 1 package TestRefection;
 2 
 3 import org.junit.Test;
 4 
 5 public class ListTest {
 6 
 7     @Test
 8     public void testHelloWorld() {
 9         try {
10             Class.forName("TestRefection.TestClass1");
11             Class clazz = TestClass3.class;
12             new TestClass2();
13         } catch (ClassNotFoundException e) {
14             // TODO Auto-generated catch block
15             e.printStackTrace();
16         }
17     }
18 
19 }
20 
21 class TestClass1 {
22     static {
23         System.out.println("=================TestClass1================");
24     }
25 }
26 
27 class TestClass2 {
28     static {
29         System.out.println("=================TestClass2================");
30     }
31 }
32 
33 class TestClass3 {
34     static {
35         System.out.println("=================TestClass3================");
36     }
37 }
38 
39 -------------------------執行結果-------------------------
40 =================TestClass1================
41 =================TestClass2================
類初始化的驗證代碼

 

獲取類的Class對象

爲了在程序運行的過程經過反射對已有類或對象作一些操做,均須要獲取Class對象,獲取Class對象有如下三種方法:code

      • Class.forName(String className); //會觸發類的初始化
      • 類名.class //僅執行到建立Class對象,不會觸發類的空間分配及初始化
      • 對象名.getClass() //首次建立對象時已完成類的初始化

Class類與java.lang.reflection類庫對反射的支持

在Java中,Class類與java.lang.reflect類庫一塊兒對反射技術進行了全力的支持。其中反射庫中Constructor類用於操做構造方法、Method類用於操做方法、Field類用於操做變量。其具體的使用能夠見下一章。htm

反射技術的使用

  關於反射技術的具體使用,不少書籍和文章都已經有了詳細的說明,如下轉載一篇反射技術的使用方法的文章,轉載地址:對象

    http://www.cnblogs.com/zhaoyanjun/p/6074887.htmlblog

相關文章
相關標籤/搜索