国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java反射經(jīng)典實例

2019-11-17 04:17:56
字體:
供稿:網(wǎng)友

 java反射經(jīng)典實例收藏
 Java提供了一套機制來動態(tài)執(zhí)行方法和構(gòu)造方法,以及數(shù)組操作等,這套機制就叫——反射。反射機制是如今很多流行框架的實現(xiàn)基礎(chǔ),其中包括SPRing、Hibernate等。原理性的問題不是本文的重點,接下來讓我們在實例中學(xué)習(xí)這套精彩的機制。

1. 得到某個對象的屬性

1 public Object getProperty(Object owner, String fieldName) throws Exception {
2     Class ownerClass = owner.getClass();
3
4     Field field = ownerClass.getField(fieldName);
5
6     Object property = field.get(owner);
7
8     return property;
9 }
Class ownerClass = owner.getClass():得到該對象的Class。

Field field = ownerClass.getField(fieldName):通過Class得到類聲明的屬性。

Object property = field.get(owner):通過對象得到該屬性的實例,如果這個屬性是非公有的,這里會報IllegalaccessException。

 

2. 得到某個類的靜態(tài)屬性

 1 public Object getStaticProperty(String className, String fieldName)
 2             throws Exception {
 3     Class ownerClass = Class.forName(className);
 4
 5     Field field = ownerClass.getField(fieldName);
 6
 7     Object property = field.get(ownerClass);
 8
 9     return property;
10 }

Class ownerClass = Class.forName(className) :首先得到這個類的Class。

Field field = ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性。

Object property = field.get(ownerClass) :這里和上面有些不同,因為該屬性是靜態(tài)的,所以直接從類的Class里取。


3. 執(zhí)行某對象的方法

 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
 2
 3     Class ownerClass = owner.getClass();
 4
 5     Class[] argsClass = new Class[args.length];
 6
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10
11     Method method = ownerClass.getMethod(methodName, argsClass);
12
13     return method.invoke(owner, args);
14 }
Class owner_class = owner.getClass() :首先還是必須得到這個對象的Class。

5~9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件。

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

method.invoke(owner, args):執(zhí)行該Method,invoke方法的參數(shù)是執(zhí)行這個方法的對象,和參數(shù)數(shù)組。返回值是Object,也既是該方法的返回值。


4. 執(zhí)行某個類的靜態(tài)方法

 1 public Object invokeStaticMethod(String className, String methodName,
 2             Object[] args) throws Exception {
 3     Class ownerClass = Class.forName(className);
 4
 5     Class[] argsClass = new Class[args.length];
 6
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10
11     Method method = ownerClass.getMethod(methodName, argsClass);
12
13     return method.invoke(null, args);
14 }

基本的原理和實例3相同,不同點是最后一行,invoke的一個參數(shù)是null,因為這是靜態(tài)方法,不需要借助實例運行。

 

5. 新建實例
 1
 2 public Object newInstance(String className, Object[] args) throws Exception {
 3     Class newoneClass = Class.forName(className);
 4
 5     Class[] argsClass = new Class[args.length];
 6
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10
11     Constructor cons = newoneClass.getConstructor(argsClass);
12
13     return cons.newInstance(args);
14
15 }

這里說的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來新建實例的方法。如果不需要參數(shù),可以直接使用newoneClass.newInstance()來實現(xiàn)。

Class newoneClass = Class.forName(className):第一步,得到要構(gòu)造的實例的Class。

第5~第9行:得到參數(shù)的Class數(shù)組。

Constructor cons = newoneClass.getConstructor(argsClass):得到構(gòu)造子。

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


6. 判斷是否為某個類的實例

1 public boolean isInstance(Object obj, Class cls) {
2     return cls.isInstance(obj);
3 }


7. 得到數(shù)組中的某個元素
1 public Object getByArray(Object array, int index) {
2     return Array.get(array,index);
3 }


附完整源碼

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

    /**
     * 得到某類的靜態(tài)公共屬性
     *
     * @param className   類名
     * @param fieldName   屬性名
     * @return 該屬性對象
     * @throws Exception
     */
    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;
    }


    /**
     * 執(zhí)行某對象方法
     *
     * @param owner
     *            對象
     * @param methodName
     *            方法名
     * @param args
     *            參數(shù)
     * @return 方法返回值
     * @throws Exception
     */
    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);
    }


      /**
     * 執(zhí)行某類的靜態(tài)方法
     *
     * @param className
     *            類名
     * @param methodName
     *            方法名
     * @param args
     *            參數(shù)數(shù)組
     * @return 執(zhí)行方法返回的結(jié)果
     * @throws Exception
     */
    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);
    }

 

    /**
     * 新建實例
     *
     * @param className
     *            類名
     * @param args
     *            構(gòu)造函數(shù)的參數(shù)
     * @return 新建的實例
     * @throws Exception
     */
    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);

    }


   
    /**
     * 是不是某個類的實例
     * @param obj 實例
     * @param cls 類
     * @return 如果 obj 是此類的實例,則返回 true
     */
    public boolean isInstance(Object obj, Class cls) {
        return cls.isInstance(obj);
    }
   
    /**
     * 得到數(shù)組中的某個元素
     * @param array 數(shù)組
     * @param index 索引
     * @return 返回指定數(shù)組對象中索引組件的值
     */
    public Object getByArray(Object array, int index) {
        return Array.get(array,index);
    }
}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 皋兰县| 金乡县| 咸阳市| 临西县| 苏尼特左旗| 梁山县| 扬州市| 斗六市| 兰考县| 东城区| 濉溪县| 镇平县| 北京市| 赤壁市| 蒙阴县| 淅川县| 万全县| 永兴县| 宜都市| 宁津县| 新竹市| 青神县| 古丈县| 高邑县| 荆门市| 阿巴嘎旗| 越西县| 利津县| 那坡县| 吉安市| 忻城县| 宜州市| 安阳县| 洪江市| 乌审旗| 天长市| 桓台县| 拉孜县| 建德市| 德阳市| 开原市|