程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java反射機制及Method.invoke詳解

Java反射機制及Method.invoke詳解

編輯:關於JAVA

Java反射機制及Method.invoke詳解。本站提示廣大學習愛好者:(Java反射機制及Method.invoke詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java反射機制及Method.invoke詳解正文


JAVA反射機制

JAVA反射機制是在運轉狀況中,關於隨意率性一個類,都可以或許曉得這個類的一切屬性和辦法;關於隨意率性一個對象,都可以或許挪用它的隨意率性一個辦法;這類靜態獲得的信息和靜態挪用對象的辦法的功效稱為java說話的反射機制。

Java反射機制重要供給了以下功效: 在運轉時斷定隨意率性一個對象所屬的類;在運轉時結構隨意率性一個類的對象;在運轉時斷定隨意率性一個類所具有的成員變量和辦法;在運轉時挪用隨意率性一個對象的辦法;生成靜態署理。

1. 獲得某個對象的屬性

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():獲得該對象的Class。

Field field = ownerClass.getField(fieldName):經由過程Class獲得類聲明的屬性。

Object property = field.get(owner):經由過程對象獲得該屬性的實例,假如這個屬性長短私有的,這裡會報IllegalAccessException。

2. 獲得某個類的靜態屬性

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) :起首獲得這個類的Class。

Field field = ownerClass.getField(fieldName):和下面一樣,經由過程Class獲得類聲明的屬性。

Object property = field.get(ownerClass) :這裡和下面有些分歧,由於該屬性是靜態的,所以直接從類的Class裡取。

3. 履行某對象的辦法


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() :起首照樣必需獲得這個對象的Class。

5~9行:設置裝備擺設參數的Class數組,作為尋覓Method的前提。

Method method = ownerClass.getMethod(methodName, argsClass):經由過程methodName和參數的argsClass(辦法中的參數類型聚集)數組獲得要履行的Method。

method.invoke(owner, args):履行該Method.invoke辦法的參數是履行這個辦法的對象owner,和參數數組args,可以這麼懂得:owner對象中帶有參數args的method辦法。前往值是Object,也既是該辦法的前往值。

4. 履行某個類的靜態辦法

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); 
 } 

根本的道理和實例3雷同,分歧點是最初一行,invoke的一個參數是null,由於這是靜態辦法,不須要借助實例運轉。

5. 新建實例

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); 
  

這裡說的辦法是履行帶參數的結構函數來新建實例的辦法。假如不須要參數,可以直接應用newoneClass.newInstance()來完成。

Class newoneClass = Class.forName(className):第一步,獲得要結構的實例的Class。

第5~第9行:獲得參數的Class數組。

Constructor cons = newoneClass.getConstructor(argsClass):獲得結構子。

cons.newInstance(args):新建實例。

6. 斷定能否為某個類的實例


public boolean isInstance(Object obj, Class cls) { 
     return cls.isInstance(obj); 

7. 獲得數組中的某個元素

public Object getByArray(Object array, int index) { 
     return Array.get(array,index); 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved