java反射機(jī)制詳解 及 Method.invoke的解釋

1JAVA反射機(jī)制
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。
Java反射機(jī)制主要提供了以下功能:
在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;
在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;
在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;
在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;生成動(dòng)態(tài)代理。

  1. 得到某個(gè)對(duì)象的屬性
    Java代碼
public Object getProperty(Object owner, String fieldName) throws Exception {  
     Class ownerClass = owner.getClass();  
   
     Field field = ownerClass.getField(fieldName);  
   
     Object property = field.get(owner);  
   
     return property;  
}  

Class ownerClass = owner.getClass():得到該對(duì)象的Class。
Field field = ownerClass.getField(fieldName):通過(guò)Class得到類聲明的屬性。
Object property = field.get(owner):通過(guò)對(duì)象得到該屬性的實(shí)例,如果這個(gè)屬性是非公有的,這里會(huì)報(bào)IllegalAccessException。

  1. 得到某個(gè)類的靜態(tài)屬性
    Java代碼
public Object getStaticProperty(String className, String fieldName)  
             throws Exception {  
     Class ownerClass = Class.forName(className);  
   
     Field field = ownerClass.getField(fieldName);  
   
     Object property = field.get(ownerClass);  
   
     return property;  
}  

Class ownerClass = Class.forName(className) :首先得到這個(gè)類的Class。
Field field = ownerClass.getField(fieldName):和上面一樣,通過(guò)Class得到類聲明的屬性。
Object property = field.get(ownerClass) :這里和上面有些不同,因?yàn)樵搶傩允庆o態(tài)的,所以直接從類的Class里取。

  1. 執(zhí)行某對(duì)象的方法
    Java代碼
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {  
   
     Class ownerClass = owner.getClass();  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
  
      Method method = ownerClass.getMethod(methodName,argsClass);  
   
     return method.invoke(owner, args);  
}  

Class owner_class = owner.getClass() :首先還是必須得到這個(gè)對(duì)象的Class。
5~9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件。Method method = ownerClass.getMethod(methodName, argsClass):通過(guò)methodName和參數(shù)的argsClass(方法中的參數(shù)類型集合)數(shù)組得到要執(zhí)行的Method。
method.invoke(owner, args):執(zhí)行該Method.invoke方法的參數(shù)是執(zhí)行這個(gè)方法的對(duì)象owner,和參數(shù)數(shù)組args,可以這么理解:owner對(duì)象中帶有參數(shù)args的method方法。返回值是Object,也既是該方法的返回值。

  1. 執(zhí)行某個(gè)類的靜態(tài)方法
    Java代碼
public Object invokeStaticMethod(String className, String methodName,  
             Object[] args) throws Exception {  
     Class ownerClass = Class.forName(className);  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
   
    Method method = ownerClass.getMethod(methodName,argsClass);  
   
     return method.invoke(null, args);  
 }  

基本的原理和實(shí)例3相同,不同點(diǎn)是最后一行,invoke的一個(gè)參數(shù)是null,因?yàn)檫@是靜態(tài)方法,不需要借助實(shí)例運(yùn)行。

  1. 新建實(shí)例
    Java代碼
public Object newInstance(String className, Object[] args) throws Exception {  
     Class newoneClass = Class.forName(className);  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
   
     Constructor cons = newoneClass.getConstructor(argsClass);  
   
     return cons.newInstance(args);  
   
}  

這里說(shuō)的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來(lái)新建實(shí)例的方法。如果不需要參數(shù),可以直接使用newoneClass.newInstance()來(lái)實(shí)現(xiàn)。Class newoneClass = Class.forName(className):
第一步,得到要構(gòu)造的實(shí)例的Class。

第5~第9行:得到參數(shù)的Class數(shù)組。
Constructor cons = newoneClass.getConstructor(argsClass):得到構(gòu)造子。cons.newInstance(args):新建實(shí)例。

  1. 判斷是否為某個(gè)類的實(shí)例
    Java代碼
public boolean isInstance(Object obj, Class cls) {  
     return cls.isInstance(obj);  
}  
  1. 得到數(shù)組中的某個(gè)元素
    Java代碼
public Object getByArray(Object array, int index) {  
     return Array.get(array,index);  
}  

轉(zhuǎn)自
http://azrael6619.iteye.com/blog/429797

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • Java反射機(jī)制 JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象...
    才兄說(shuō)閱讀 7,368評(píng)論 0 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,662評(píng)論 18 399
  • 遠(yuǎn)處是海 是未來(lái) 是希望
    北洋z閱讀 112評(píng)論 0 0
  • 剛嘚瑟完就生病了……計(jì)劃好今天看完一本書,游泳全泡湯了。一天都在迷迷糊糊中度過(guò)…… 人真不能輕易嘚瑟,嘚瑟啥必反之...
    公舉夜未眠閱讀 212評(píng)論 0 0

友情鏈接更多精彩內(nèi)容