什么是反射, Java反射的三種實現方式


Java的反射(reflection)機制是指在程序的 運行狀態中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。這種動態獲取程序信息以及動態調用對象的功能稱為Java語言的反射機制。反射被視為動態語言的關鍵。
 
都以Foo為類名舉例
表示實例對象的方式:
類名 表示名=new 類名();
//Foo的實例對象如何表示
 
  Foo foo1 = new Foo();
 

 

 
任何一個類都是Class的實例對象,這個實例對象有三種表示方式:
任何一個類都有一個隱含的靜態成員變量class
第一種表示方式:
 
 
Class c1=Foo.class;//注意Class要大寫C

 

 第二種表達方式:已經知道該類的對象通過getClass方法
 
 
Class c2 = foo1.getClass();
//c1 ,c2 表示了Foo類的類類型(class type)

 

 
 
 
 
 
第三中表達方式:
 
 
Class c3=null;
try
{
    c3=Class.forName("Foo的相對路徑");
}
catch (Exception e)
{
    e.printStackTrace();
}
//可以使用newInstance方法創建Foo的實例對象
try
{
    Foo foo=(Foo)c1.newInstance();
//(Foo)Foo是Foo的接口
    foo.print();
}catch (Exception e){e.printStackTrace();
}
通過Foo的接口來找到Foo的類類型
然后通過newInstance()方法來初始化一個類
生成一個實例對象。
使用newInstance方法時必須保證:
這個類已經加載 這個類已經連接了。
完成這倆步的正是class的靜態方法forName()方法 這個方法調用了啟動類加載器(java api的加載器) 動態加載類
try{ Class c=class.forName(args[0]); 類名 表示名 =(接口)c.newInstance(); 表示名.方法(); }catch(Exception e){e.printStrckTrace}

 最常用的是第一種方式.

但如果只獲得一個字符串,例如獲得String類對應的Class對象,則不能使用String.class方式,而是使用Class.forName("java.lang.String")。注意:如果要想獲得基本數據類型的Class對象,可以使用對應的打包類加上.TYPE,例如,Integer.TYPE可獲得int的Class對象,但要獲得Integer.class的Class對象,則必須使用Integer.class。在獲得Class對象后,就可以使用表13.4中的方法來取得Class對象的基本信息


免責聲明!

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



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