Java反射機制學習筆記

來源:互聯網
上載者:User

1.Java反射機制的作用

在 Java 運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意
一個對象,能否調用它的任意一個方法?答案是肯定的。這種動態擷取類的資訊,以及動態
調用對象的方法的功能來自於Java 語言的反射(Reflection)機制。Java 反射機制主要提供
了以下功能:
l 在運行時判斷任意一個對象所屬的類;
l 在運行時構造任意一個類的對象;
l 在運行時判斷任意一個類所具有的成員變數和方法;
l 在運行時調用任意一個對象的方法;
l 產生動態代理。
本章首先介紹了Java Reflection API的用法,然後介紹了一個遠程方法調用的例子,在
這個例子中用戶端能夠遠程調用伺服器端的一個對象的方法。伺服器端採用了反射機制提供
的動態調用方法的功能,而用戶端則採用了反射機制提供的動態代理功能


2.Java反射中所涉及的幾個重要的類,這些類都位於java.lang.reflect包中

Class類:代表一個類,通過反射操作一個類,都需要需要根據指定的類建立一個Class對象

Method類:代表類中的方法,為了操作一個方法,java.lang.reflect提供了Method類,可以建立指定

               方法的Method對象,這個對象就代表了這個方法,這也體現了一切都是對象的思想。

Field類:代表類的成員變數

Constructor類:代表類的構造方法,這裡不解析,因為都可以像Method類一樣理解

Array類:用於動態建立數組,以及訪問數組元素


3
.使用java.lang.reflect包中的類的三個步驟

1.獲得一個java.lang.Class對象,這個對象是通過指定你要操作的類而獲得。java.lang.Class在運 行的java程式被用作代表類和介面(

The first step is to obtain a java.lang.Class

object for the class that you want to manipulate. java.lang.Class

is used to represent classes and interfaces in a running Java program.
)。

獲得java.lang.Class對象由三種方法:


One way of obtaining a Class object is to say:
Class c = Class.forName("java.lang.String");<br />to get the Class object for String<br />Another approach is to use:<br />Class c = int.class;<br />or<br />Class c = Integer.TYPE;</p><p>

 2.獲得類資訊,例如method、field、constructor(The second step is to call a method such as getDeclaredMethods, to get a list of all the methods declared by the class.)。

 

3.獲得資訊後,利用反射機制的API操作這些資訊(Once this information is in hand, then the third step is to use the
reflection API to manipulate the information. For example)。

 

4.對Method類中的invoke方法的理解

Method (Java 2 Platform SE 6)

 

invoke<br />public Objectinvoke(Object obj, Object ... args) throws IllegalAccessException<br />, IllegalArgumentException<br />,InvocationTargetException<br />

對帶有指定參數的指定對象調用由此 Method

對象表示的底層方法。個別參數被自動解包,以便與基本形參相匹配,基本參數和引用參數都隨需服從方法調用轉換。

如果底層方法是靜態,那麼可以忽略指定的 obj
參數。該參數可以為 null。

如果底層方法所需的形參數為 0,則所提供的 args
數組長度可以為 0 或 null。

如果底層方法是執行個體方法,則使用動態方法尋找來調用它,這一點記錄在 Java Language Specification, Second Edition
的第 15.12.4.4 節中;在發生基於目標對象的運行時類型的重寫時更應該這樣做。

如果底層方法是靜態,並且尚未初始化聲明此方法的類,則會將其初始化。

如果方法正常完成,則將該方法返回的值返回給調用者;如果該值為基本類型,則首先適當地將其封裝在對象中。但是,如果該值的類型為一組基本類型,則數組元素

被封裝在對象中;換句話說,將返回基本類型的數組。如果底層方法傳回型別為 void,則該調用返回 null。

 

參數:
obj
- 從中調用底層方法的對象
args
- 用於方法調用的參數
返回:
使用參數 args
obj
上指派該對象所表示方法的結果
拋出:

IllegalAccessException

- 如果此 Method
對象強制執行 Java 語言存取控制,並且底層方法是不可訪問的。

IllegalArgumentException

-
如果該方法是執行個體方法,且指定對象參數不是聲明底層方法的類或介面(或其中的子類或實現程式)的執行個體;如果實參和形參的數量不相同;如果基本參數的解包轉換失敗;如果在解包後,無法通過方法調用轉換將參數值轉換為相應的形參類型。

InvocationTargetException

- 如果底層方法拋出異常。

NullPointerException

- 如果指定對象為 null,且該方法是一個執行個體方法。

ExceptionInInitializerError

- 如果由此方法引起的初始化失敗。

對該方法的理解我們來看一個具體的例子:
  import java.lang.reflect.*;     public class method2 {      public int add(int a, int b)      {         return a + b;      }      public static void main(String args[])      {         try {           Class cls = Class.forName("method2");           Class partypes[] = new Class[2];            partypes[0] = Integer.TYPE;            partypes[1] = Integer.TYPE;            Method meth = cls.getMethod(              "add", partypes);(1)            method2 methobj = new method2();(2)            Object arglist[] = new Object[2];            arglist[0] = new Integer(37);            arglist[1] = new Integer(47);            Object retobj               = meth.invoke(methobj, arglist);(3)            Integer retval = (Integer)retobj;            System.out.println(retval.intValue());         }         catch (Throwable e) {            System.err.println(e);         }      }   }


(1)處建立了一個指定方法的對象,(2)處調用該對象表示的底層方法
在這裡要有一個思維的變換,我們在(2)處建立了一個method2的對象,按照我們的習慣,調用某某方法都是methobj.xx()這樣調用,但是用到反射之後我們就不能這麼調用了,而是把此對象當成一個參數了。
首先來看對invoke方法的解釋:對帶有指定參數的指定對象調用由此 Method

對象表示的底層方法。

分析:Object retobj=meth.invoke(methobj,arglist);
這句話的結果就是調用了add方法,但是不知直接調用的,“帶有指定參數的指定對象”這裡指的就是methOject和arglist,“此Method對象”表示的就是meth。這裡調用方法轉了一個彎,總而言之我們在用到此方法時一定要把思維轉過來,這個時候我們不再需要手動去指定調用方法,而是通過傳入主體對象和參數,然後程式會自動協助我們調用要調用的方法。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.