• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0

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

            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. 得到某個類的靜態屬性

            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) :這里和上面有些不同,因為該屬性是靜態的,所以直接從類的Class里取。


            3. 執行某對象的方法

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

            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. 執行某個類的靜態方法

            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的一個參數是null,因為這是靜態方法,不需要借助實例運行。

             

            5. 新建實例

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

            這里說的方法是執行帶參數的構造函數來新建實例的方法。如果不需要參數,可以直接使用newoneClass.newInstance()來實現。

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

            第6~第10行:得到參數的Class數組。

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

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


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

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


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

            1. public Object getByArray(Object array, int index) {       
            2.     return Array.get(array,index);                        
            3. }                                                         


            附完整源碼:

            1. import java.lang.reflect.Array;   
            2. import java.lang.reflect.Constructor;   
            3. import java.lang.reflect.Field;   
            4. import java.lang.reflect.Method;   
            5.   
            6.   
            7. /**  
            8.  * Java Reflection Cookbook  
            9.  *  
            10.  * @author Michael Lee  
            11.  * @since 2006-8-23  
            12.  * @version 0.1a  
            13.  */  
            14.   
            15. public class Reflection {   
            16.     /**  
            17.      * 得到某個對象的公共屬性  
            18.      *  
            19.      * @param owner, fieldName  
            20.      * @return 該屬性對象  
            21.      * @throws Exception  
            22.      *  
            23.      */  
            24.     public Object getProperty(Object owner, String fieldName) throws Exception {   
            25.         Class ownerClass = owner.getClass();   
            26.   
            27.         Field field = ownerClass.getField(fieldName);   
            28.   
            29.         Object property = field.get(owner);   
            30.   
            31.         return property;   
            32.     }   
            33.   
            34.     /**  
            35.      * 得到某類的靜態公共屬性  
            36.      *  
            37.      * @param className   類名  
            38.      * @param fieldName   屬性名  
            39.      * @return 該屬性對象  
            40.      * @throws Exception  
            41.      */  
            42.     public Object getStaticProperty(String className, String fieldName)   
            43.             throws Exception {   
            44.         Class ownerClass = Class.forName(className);   
            45.   
            46.         Field field = ownerClass.getField(fieldName);   
            47.   
            48.         Object property = field.get(ownerClass);   
            49.   
            50.         return property;   
            51.     }   
            52.   
            53.   
            54.     /**  
            55.      * 執行某對象方法  
            56.      *  
            57.      * @param owner  
            58.      *            對象  
            59.      * @param methodName  
            60.      *            方法名  
            61.      * @param args  
            62.      *            參數  
            63.      * @return 方法返回值  
            64.      * @throws Exception  
            65.      */  
            66.     public Object invokeMethod(Object owner, String methodName, Object[] args)   
            67.             throws Exception {   
            68.   
            69.         Class ownerClass = owner.getClass();   
            70.   
            71.         Class[] argsClass = new Class[args.length];   
            72.   
            73.         for (int i = 0, j = args.length; i < j; i++) {   
            74.             argsClass[i] = args[i].getClass();   
            75.         }   
            76.   
            77.         Method method = ownerClass.getMethod(methodName, argsClass);   
            78.   
            79.         return method.invoke(owner, args);   
            80.     }   
            81.   
            82.   
            83.       /**  
            84.      * 執行某類的靜態方法  
            85.      *  
            86.      * @param className  
            87.      *            類名  
            88.      * @param methodName  
            89.      *            方法名  
            90.      * @param args  
            91.      *            參數數組  
            92.      * @return 執行方法返回的結果  
            93.      * @throws Exception  
            94.      */  
            95.     public Object invokeStaticMethod(String className, String methodName,   
            96.             Object[] args) throws Exception {   
            97.         Class ownerClass = Class.forName(className);   
            98.   
            99.         Class[] argsClass = new Class[args.length];   
            100.   
            101.         for (int i = 0, j = args.length; i < j; i++) {   
            102.             argsClass[i] = args[i].getClass();   
            103.         }   
            104.   
            105.         Method method = ownerClass.getMethod(methodName, argsClass);   
            106.   
            107.         return method.invoke(null, args);   
            108.     }   
            109.   
            110.   
            111.   
            112.     /**  
            113.      * 新建實例  
            114.      *  
            115.      * @param className  
            116.      *            類名  
            117.      * @param args  
            118.      *            構造函數的參數  
            119.      * @return 新建的實例  
            120.      * @throws Exception  
            121.      */  
            122.     public Object newInstance(String className, Object[] args) throws Exception {   
            123.         Class newoneClass = Class.forName(className);   
            124.   
            125.         Class[] argsClass = new Class[args.length];   
            126.   
            127.         for (int i = 0, j = args.length; i < j; i++) {   
            128.             argsClass[i] = args[i].getClass();   
            129.         }   
            130.   
            131.         Constructor cons = newoneClass.getConstructor(argsClass);   
            132.   
            133.         return cons.newInstance(args);   
            134.   
            135.     }   
            136.   
            137.   
            138.        
            139.     /**  
            140.      * 是不是某個類的實例  
            141.      * @param obj 實例  
            142.      * @param cls 類  
            143.      * @return 如果 obj 是此類的實例,則返回 true  
            144.      */  
            145.     public boolean isInstance(Object obj, Class cls) {   
            146.         return cls.isInstance(obj);   
            147.     }   
            148.        
            149.     /**  
            150.      * 得到數組中的某個元素  
            151.      * @param array 數組  
            152.      * @param index 索引  
            153.      * @return 返回指定數組對象中索引組件的值  
            154.      */  
            155.     public Object getByArray(Object array, int index) {   
            156.         return Array.get(array,index);   
            157.     }   
            158. }  
            posted on 2012-02-16 09:19 luis 閱讀(319) 評論(0)  編輯 收藏 引用 所屬分類: Java筆記
            <2012年4月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            无码人妻久久一区二区三区蜜桃| 精品久久国产一区二区三区香蕉| 久久乐国产综合亚洲精品| 久久精品国产精品亚洲精品| 久久久久亚洲av综合波多野结衣| 亚洲午夜久久久久久久久电影网| 亚洲AV无码一区东京热久久| 久久电影网2021| 午夜视频久久久久一区| 东京热TOKYO综合久久精品| 精品国产一区二区三区久久蜜臀| 亚洲综合熟女久久久30p| 久久成人18免费网站| 亚洲色欲久久久综合网| 久久久久一本毛久久久| 久久精品人成免费| 人妻无码精品久久亚瑟影视| 91久久香蕉国产熟女线看| 777午夜精品久久av蜜臀| 九九久久精品国产| 精品一区二区久久久久久久网站| 2021国内精品久久久久久影院| 免费国产99久久久香蕉| 久久久一本精品99久久精品88| 尹人香蕉久久99天天拍| 国产AV影片久久久久久| 国产一区二区三区久久| 亚洲精品国产美女久久久| 久久婷婷五月综合97色直播| 久久青青国产| 九九热久久免费视频| 久久婷婷人人澡人人| 久久九九久精品国产免费直播| 久久国产精品99久久久久久老狼 | 97超级碰碰碰久久久久| 精品国产青草久久久久福利| 亚洲?V乱码久久精品蜜桃 | 久久久久免费看成人影片| 久久精品一区二区三区AV| 欧美伊人久久大香线蕉综合| 中文精品99久久国产|