青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(336) 評論(0)  編輯 收藏 引用 所屬分類: Java筆記
<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

文章分類

文章檔案

友情鏈接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品美女久久久免费| 欧美日韩中文字幕综合视频| 亚洲欧美精品| 有码中文亚洲精品| 国产精品一区二区三区观看| 美女黄网久久| 国产精品99久久久久久有的能看| 久久久久久久精| 欧美中文字幕精品| 欧美在线视频一区| 亚洲日本电影| 亚洲人成网站影音先锋播放| 国产专区一区| 国产日韩亚洲欧美| 好吊色欧美一区二区三区四区| 国产日韩高清一区二区三区在线| 国产精品yjizz| 国产女人精品视频| 一区二区视频欧美| 亚洲精品一二三| 亚洲男人第一av网站| 欧美一级免费视频| 久久综合久久综合久久综合| 亚洲国产精品一区制服丝袜| 欧美成人免费大片| 99国产精品一区| 久久久亚洲国产美女国产盗摄| 老巨人导航500精品| 欧美天天视频| 亚洲伦伦在线| 美女视频网站黄色亚洲| 99天天综合性| 欧美成人免费小视频| 国产视频丨精品|在线观看| 亚洲国产精品一区二区第一页| 亚洲欧美成人| 亚洲在线电影| 欧美日本亚洲韩国国产| 一区二区三区在线视频免费观看| 亚洲欧美日韩专区| 亚洲精品视频免费在线观看| 久久伊伊香蕉| 黄色在线一区| 欧美成在线观看| 欧美专区18| 亚洲免费在线| 国产日产欧产精品推荐色| 亚洲一区二区欧美日韩| 亚洲天堂成人在线视频| 亚洲福利精品| 欧美在线亚洲在线| 欧美在线视频网站| 亚洲成人在线观看视频| 欧美fxxxxxx另类| 欧美精品不卡| 欧美一区二区三区四区在线 | 亚洲国产黄色片| 久久人91精品久久久久久不卡| 久久精品99| 一区二区电影免费观看| 亚洲欧美在线一区| 亚洲人成在线播放| 中日韩美女免费视频网站在线观看| 国产精品日日做人人爱| 免费观看日韩| 国产精品最新自拍| 亚洲欧洲中文日韩久久av乱码| 欧美视频免费在线| 欧美激情在线狂野欧美精品| 国产精品网曝门| 99视频国产精品免费观看| 影音先锋成人资源站| 亚洲性感美女99在线| 亚洲国产裸拍裸体视频在线观看乱了| 99国产精品99久久久久久粉嫩| 亚洲国产高潮在线观看| 午夜天堂精品久久久久| 亚洲欧美日韩国产另类专区| 麻豆免费精品视频| 欧美视频一区二区三区| 久久最新视频| 狠狠久久亚洲欧美专区| 久久黄金**| 欧美成人午夜剧场免费观看| 国产精品拍天天在线| 亚洲性夜色噜噜噜7777| 一区二区欧美视频| 欧美精品综合| 亚洲一区二区三区在线看| 亚洲午夜国产成人av电影男同| 欧美日韩成人精品| 久久成人人人人精品欧| 国产日韩精品一区二区| 欧美一级大片在线观看| 国产欧美一区二区三区久久 | 亚洲天堂偷拍| 美女久久一区| 亚洲免费人成在线视频观看| 国产精品乱码妇女bbbb| 亚洲男人的天堂在线aⅴ视频| 久久久噜噜噜久久中文字幕色伊伊| 国产综合色精品一区二区三区| 午夜影视日本亚洲欧洲精品| 欧美成人激情在线| 亚洲小视频在线观看| 精品av久久707| 国产精品一区二区男女羞羞无遮挡| 久久久国产午夜精品| 亚洲麻豆av| 亚洲激情国产| 麻豆精品视频在线观看| 亚洲美女电影在线| 欧美大片一区二区三区| 午夜精品久久久久久99热| 亚洲欧洲日韩在线| 亚洲国产合集| 最新成人在线| 最新成人av网站| 亚洲美女视频在线观看| 亚洲高清免费视频| 亚洲国产毛片完整版 | 国产精品久久久久久久久久尿| 久久久久久久久久久久久女国产乱| 一区二区成人精品| 亚洲一级网站| 亚洲视频网在线直播| 亚洲国产高清视频| 欧美国产激情| 亚洲精品一区二区三区婷婷月| 亚洲电影免费| 亚洲视频狠狠| 老司机午夜免费精品视频| 欧美国产日韩二区| 国产精品人人做人人爽| 国产午夜精品理论片a级大结局 | 久久免费高清视频| 欧美在线免费一级片| 老司机午夜精品| 国产精品久久久久久久免费软件| 欧美日韩亚洲三区| 一区二区三区在线视频免费观看| 亚洲日本aⅴ片在线观看香蕉| 亚洲一区国产精品| 免费亚洲视频| 欧美亚洲在线播放| 久久久久久夜精品精品免费| 免费看成人av| 亚洲午夜精品一区二区| 狼人社综合社区| 国产亚洲视频在线| 亚洲一区视频在线观看视频| 欧美激情精品久久久久久久变态 | 国产日韩欧美精品| 亚洲精品国产欧美| 久久蜜桃精品| 久久精品人人做人人爽| 国产嫩草影院久久久久| 亚洲视频精品在线| 亚洲精品在线二区| 欧美视频二区| 欧美在线视频一区| 久久国产精品电影| 亚洲第一主播视频| 亚洲高清激情| 欧美丰满高潮xxxx喷水动漫| 亚洲国内自拍| 亚洲精品日韩激情在线电影| 欧美欧美在线| 性欧美videos另类喷潮| 亚洲欧美网站| 亚洲精品一区二区三区福利| 亚洲精品国产精品国自产在线| 欧美黑人多人双交| 亚洲欧美在线高清| 久久久精品免费视频| 亚洲精品女av网站| 亚洲欧美99| 一区二区免费在线播放| 欧美在线视频免费| 一本到12不卡视频在线dvd| 亚洲欧美日韩综合aⅴ视频| 一本在线高清不卡dvd| 免费观看久久久4p| 亚洲一区二区三区成人在线视频精品 | 性欧美1819sex性高清| 91久久线看在观草草青青| 亚洲网站在线看| 亚洲深爱激情| 欧美成人精品一区二区三区| 久久久久久久久蜜桃| 欧美日韩一区二区在线播放| 你懂的一区二区| 极品中文字幕一区| 午夜视频一区在线观看| 在线亚洲激情| 欧美日韩国产精品专区| 亚洲激情在线观看视频免费| 伊人狠狠色j香婷婷综合| 午夜欧美精品久久久久久久| 先锋影音网一区二区|