Java反射經典實例

  1. Java提供了一套機制來動態執行方法和構造方法,以及數組操作等,這套機制就叫——反射。反射機制是如今很多流行框架的實現基礎,其中包括Spring、Hibernate等。原理性的問題不是本文的重點,接下來讓我們在實例中學習這套精彩的機制。  
  2.   
  3. 1 . 得到某個對象的屬性  
  4.   
  5. 1   public  Object getProperty(Object owner, String fieldName)  throws  Exception {  
  6. 2      Class ownerClass = owner.getClass();  
  7. 3    
  8. 4      Field field = ownerClass.getField(fieldName);  
  9. 5    
  10. 6      Object property = field.get(owner);  
  11. 7    
  12. 8       return  property;  
  13. 9  }  
  14. Class ownerClass = owner.getClass():得到該對象的Class。  
  15.   
  16. Field field = ownerClass.getField(fieldName):通過Class得到類聲明的屬性。  
  17.   
  18. Object property = field.get(owner):通過對象得到該屬性的實例,如果這個屬性是非公有的,這裏會報IllegalAccessException。  
  19.   
  20.   
  21.   
  22. 2 . 得到某個類的靜態屬性  
  23.   
  24.  1   public  Object getStaticProperty(String className, String fieldName)  
  25.  2               throws  Exception {  
  26.  3      Class ownerClass = Class.forName(className);  
  27.  4    
  28.  5      Field field = ownerClass.getField(fieldName);  
  29.  6    
  30.  7      Object property = field.get(ownerClass);  
  31.  8    
  32.  9       return  property;  
  33. 10  }  
  34.   
  35. Class ownerClass = Class.forName(className) :首先得到這個類的Class。  
  36.   
  37. Field field = ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性。  
  38.   
  39. Object property = field.get(ownerClass) :這裏和上面有些不同,因爲該屬性是靜態的,所以直接從類的Class裏取。  
  40.   
  41.   
  42. 3 . 執行某對象的方法  
  43.   
  44.  1   public  Object invokeMethod(Object owner, String methodName, Object[] args)  throws  Exception {  
  45.  2    
  46.  3      Class ownerClass = owner.getClass();  
  47.  4    
  48.  5      Class[] argsClass =  new  Class[args.length];  
  49.  6    
  50.  7       for  ( int  i =  0 , j = args.length; i < j; i++) {  
  51.  8          argsClass[i] = args[i].getClass();  
  52.  9      }  
  53. 10    
  54. 11      Method method = ownerClass.getMethod(methodName, argsClass);  
  55. 12    
  56. 13       return  method.invoke(owner, args);  
  57. 14  }  
  58. Class owner_class = owner.getClass() :首先還是必須得到這個對象的Class。  
  59.   
  60. 5 9 行:配置參數的Class數組,作爲尋找Method的條件。  
  61.   
  62. Method method = ownerClass.getMethod(methodName, argsClass):通過Method名和參數的Class數組得到要執行的Method。  
  63.   
  64. method.invoke(owner, args):執行該Method,invoke方法的參數是執行這個方法的對象,和參數數組。返回值是Object,也既是該方法的返回值。  
  65.   
  66.   
  67. 4 . 執行某個類的靜態方法  
  68.   
  69.  1   public  Object invokeStaticMethod(String className, String methodName,  
  70.  2              Object[] args)  throws  Exception {  
  71.  3      Class ownerClass = Class.forName(className);  
  72.  4    
  73.  5      Class[] argsClass =  new  Class[args.length];  
  74.  6    
  75.  7       for  ( int  i =  0 , j = args.length; i < j; i++) {  
  76.  8          argsClass[i] = args[i].getClass();  
  77.  9      }  
  78. 10    
  79. 11      Method method = ownerClass.getMethod(methodName, argsClass);  
  80. 12    
  81. 13       return  method.invoke( null , args);  
  82. 14  }  
  83.   
  84. 基本的原理和實例3 相同,不同點是最後一行,invoke的一個參數是 null ,因爲這是靜態方法,不需要藉助實例運行。  
  85.   
  86.   
  87.   
  88. 5 . 新建實例  
  89.  1    
  90.  2   public  Object newInstance(String className, Object[] args)  throws  Exception {  
  91.  3      Class newoneClass = Class.forName(className);  
  92.  4    
  93.  5      Class[] argsClass =  new  Class[args.length];  
  94.  6    
  95.  7       for  ( int  i =  0 , j = args.length; i < j; i++) {  
  96.  8          argsClass[i] = args[i].getClass();  
  97.  9      }  
  98. 10    
  99. 11      Constructor cons = newoneClass.getConstructor(argsClass);  
  100. 12    
  101. 13       return  cons.newInstance(args);  
  102. 14    
  103. 15  }  
  104.   
  105. 這裏說的方法是執行帶參數的構造函數來新建實例的方法。如果不需要參數,可以直接使用newoneClass.newInstance()來實現。  
  106.   
  107. Class newoneClass = Class.forName(className):第一步,得到要構造的實例的Class。  
  108.   
  109. 5 ~第 9 行:得到參數的Class數組。  
  110.   
  111. Constructor cons = newoneClass.getConstructor(argsClass):得到構造子。  
  112.   
  113. cons.newInstance(args):新建實例。  
  114.   
  115.   
  116. 6 . 判斷是否爲某個類的實例  
  117.   
  118. 1   public   boolean  isInstance(Object obj, Class cls) {  
  119. 2       return  cls.isInstance(obj);  
  120. 3  }  
  121.   
  122.   
  123. 7 . 得到數組中的某個元素  
  124. 1   public  Object getByArray(Object array,  int  index) {  
  125. 2       return  Array.get(array,index);  
  126. 3  }  
  127.   
  128.   
  129. 附完整源碼:  
  130.   
  131. import  java.lang.reflect.Array;  
  132. import  java.lang.reflect.Constructor;  
  133. import  java.lang.reflect.Field;  
  134. import  java.lang.reflect.Method;  
  135.   
  136.   
  137. /**  
  138.  * Java Reflection Cookbook  
  139.  *  
  140.  * @author Michael Lee  
  141.  * @since 2006-8-23  
  142.  * @version 0.1a  
  143.  */   
  144.   
  145. public   class  Reflection {  
  146.     /**  
  147.      * 得到某個對象的公共屬性  
  148.      *  
  149.      * @param owner, fieldName  
  150.      * @return 該屬性對象  
  151.      * @throws Exception  
  152.      *  
  153.      */   
  154.     public  Object getProperty(Object owner, String fieldName)  throws  Exception {  
  155.         Class ownerClass = owner.getClass();  
  156.   
  157.         Field field = ownerClass.getField(fieldName);  
  158.   
  159.         Object property = field.get(owner);  
  160.   
  161.         return  property;  
  162.     }  
  163.   
  164.     /**  
  165.      * 得到某類的靜態公共屬性  
  166.      *  
  167.      * @param className   類名  
  168.      * @param fieldName   屬性名  
  169.      * @return 該屬性對象  
  170.      * @throws Exception  
  171.      */   
  172.     public  Object getStaticProperty(String className, String fieldName)  
  173.             throws  Exception {  
  174.         Class ownerClass = Class.forName(className);  
  175.   
  176.         Field field = ownerClass.getField(fieldName);  
  177.   
  178.         Object property = field.get(ownerClass);  
  179.   
  180.         return  property;  
  181.     }  
  182.   
  183.   
  184.     /**  
  185.      * 執行某對象方法  
  186.      *  
  187.      * @param owner  
  188.      *            對象  
  189.      * @param methodName  
  190.      *            方法名  
  191.      * @param args  
  192.      *            參數  
  193.      * @return 方法返回值  
  194.      * @throws Exception  
  195.      */   
  196.     public  Object invokeMethod(Object owner, String methodName, Object[] args)  
  197.             throws  Exception {  
  198.   
  199.         Class ownerClass = owner.getClass();  
  200.   
  201.         Class[] argsClass = new  Class[args.length];  
  202.   
  203.         for  ( int  i =  0 , j = args.length; i < j; i++) {  
  204.             argsClass[i] = args[i].getClass();  
  205.         }  
  206.   
  207.         Method method = ownerClass.getMethod(methodName, argsClass);  
  208.   
  209.         return  method.invoke(owner, args);  
  210.     }  
  211.   
  212.   
  213.       /**  
  214.      * 執行某類的靜態方法  
  215.      *  
  216.      * @param className  
  217.      *            類名  
  218.      * @param methodName  
  219.      *            方法名  
  220.      * @param args  
  221.      *            參數數組  
  222.      * @return 執行方法返回的結果  
  223.      * @throws Exception  
  224.      */   
  225.     public  Object invokeStaticMethod(String className, String methodName,  
  226.             Object[] args) throws  Exception {  
  227.         Class ownerClass = Class.forName(className);  
  228.   
  229.         Class[] argsClass = new  Class[args.length];  
  230.   
  231.         for  ( int  i =  0 , j = args.length; i < j; i++) {  
  232.             argsClass[i] = args[i].getClass();  
  233.         }  
  234.   
  235.         Method method = ownerClass.getMethod(methodName, argsClass);  
  236.   
  237.         return  method.invoke( null , args);  
  238.     }  
  239.   
  240.   
  241.   
  242.     /**  
  243.      * 新建實例  
  244.      *  
  245.      * @param className  
  246.      *            類名  
  247.      * @param args  
  248.      *            構造函數的參數  
  249.      * @return 新建的實例  
  250.      * @throws Exception  
  251.      */   
  252.     public  Object newInstance(String className, Object[] args)  throws  Exception {  
  253.         Class newoneClass = Class.forName(className);  
  254.   
  255.         Class[] argsClass = new  Class[args.length];  
  256.   
  257.         for  ( int  i =  0 , j = args.length; i < j; i++) {  
  258.             argsClass[i] = args[i].getClass();  
  259.         }  
  260.   
  261.         Constructor cons = newoneClass.getConstructor(argsClass);  
  262.   
  263.         return  cons.newInstance(args);  
  264.   
  265.     }  
  266.   
  267.   
  268.       
  269.     /**  
  270.      * 是不是某個類的實例  
  271.      * @param obj 實例  
  272.      * @param cls 類  
  273.      * @return 如果 obj 是此類的實例,則返回 true  
  274.      */   
  275.     public   boolean  isInstance(Object obj, Class cls) {  
  276.         return  cls.isInstance(obj);  
  277.     }  
  278.       
  279.     /**  
  280.      * 得到數組中的某個元素  
  281.      * @param array 數組  
  282.      * @param index 索引  
  283.      * @return 返回指定數組對象中索引組件的值  
  284.      */   
  285.     public  Object getByArray(Object array,  int  index) {  
  286.         return  Array.get(array,index);  
  287.     }  
  288. }
發佈了14 篇原創文章 · 獲贊 2 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章