天天看點

Java 反射經典執行個體

Java提供了一套機制來動态執行方法和構造方法,以及數組操作等,這套機制就叫——反射。反射機制是如今很多流行架構的實作基礎,其中包括Spring、Hibernate等。原理性的問題不是本文的重點,接下來讓我們在執行個體中學習這套精彩的機制.

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。

3~6行:配置參數的Class數組,作為尋找Method的條件。

Method method = ownerClass.getMethod(methodName, argsClass):通過Method名和參數的Class數組得到要執行的Method。

method.invoke(owner, args):執行該Method,invoke方法的參數是執行這個方法的對象,和參數數組。傳回值是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);                                

    Constructor cons = newoneClass.getConstructor(argsClass);                    

    return cons.newInstance(args);                                               

這裡說的方法是執行帶參數的構造函數來建立執行個體的方法。如果不需要參數,可以直接使用newoneClass.newInstance()來實作。

Class newoneClass = Class.forName(className):第一步,得到要構造的執行個體的Class。

第6~第10行:得到參數的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);                        

附完整源碼:

import java.lang.reflect.Array;   

import java.lang.reflect.Constructor;   

import java.lang.reflect.Field;   

import java.lang.reflect.Method;   

/**  

 * Java Reflection Cookbook  

 *  

 * @author Michael Lee  

 * @since 2006-8-23  

 * @version 0.1a  

 */  

public class Reflection {   

    /**  

     * 得到某個對象的公共屬性  

     *  

     * @param owner, fieldName  

     * @return 該屬性對象  

     * @throws Exception  

     */  

    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;   

    }   

     * 得到某類的靜态公共屬性  

     * @param className   類名  

     * @param fieldName   屬性名  

    public Object getStaticProperty(String className, String fieldName)   

            throws Exception {   

        Class ownerClass = Class.forName(className);   

        Object property = field.get(ownerClass);   

     * 執行某對象方法  

     * @param owner  

     *            對象  

     * @param methodName  

     *            方法名  

     * @param args  

     *            參數  

     * @return 方法傳回值  

    public Object invokeMethod(Object owner, String methodName, Object[] args)   

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

      /**  

     * 執行某類的靜态方法  

     * @param className  

     *            類名  

     *            參數數組  

     * @return 執行方法傳回的結果  

    public Object invokeStaticMethod(String className, String methodName,   

            Object[] args) throws Exception {   

        return method.invoke(null, args);   

     * 建立執行個體  

     *            構造函數的參數  

     * @return 建立的執行個體  

    public Object newInstance(String className, Object[] args) throws Exception {   

        Class newoneClass = Class.forName(className);   

        Constructor cons = newoneClass.getConstructor(argsClass);   

        return cons.newInstance(args);   

     * 是不是某個類的執行個體  

     * @param obj 執行個體  

     * @param cls 類  

     * @return 如果 obj 是此類的執行個體,則傳回 true  

    public boolean isInstance(Object obj, Class cls) {   

        return cls.isInstance(obj);   

     * 得到數組中的某個元素  

     * @param array 數組  

     * @param index 索引  

     * @return 傳回指定數組對象中索引元件的值  

    public Object getByArray(Object array, int index) {   

        return Array.get(array,index);   

本文轉自 tony_action 51CTO部落格,原文連結:http://blog.51cto.com/tonyaction/51472,如需轉載請自行聯系原作者