关闭

java反射机制

标签: java
285人阅读 评论(0) 收藏 举报
分类:

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括SpringHibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。 


1. 得到某个对象的属性 

Java代码  

收藏代码

  1. public Object getProperty(Object owner, String fieldName) throws Exception {         
  1.     Class ownerClass = owner.getClass();                                             
  2.                                                                                      
  3.     Field field = ownerClass.getField(fieldName);                                    
  4.                                                                                      
  5.     Object property = field.get(owner);                                              
  6.                                                                                      
  7.     return property;                                                                 
  8. }                                                                        

            

 

Class ownerClass =owner.getClass():得到该对象的Class。 

 

Field field =ownerClass.getField(fieldName):通过Class得到类声明的属性。 

 

Object property =field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。 

 

 

 

2. 得到某个类的静态属性 

Java代码  

收藏代码

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

  

Class ownerClass =Class.forName(className) :首先得到这个类的Class。 

 

Field field =ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。 

 

Object property =field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。 

 

 

3. 执行某对象的方法 

 

Java代码  

收藏代码

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

   

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. 执行某个类的静态方法 

 

Java代码  

收藏代码

  1. public Object invokeStaticMethod(String className, String methodName,               
  1.             Object[] args) throws Exception {                                       
  2.     Class ownerClass = 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.     Method method = ownerClass.getMethod(methodName, argsClass);                    
  11.                                                                                     
  12.     return method.invoke(null, args);                                               
  13. }       

                                                                            

基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。 

 

 

 

5. 新建实例 

 

Java代码  

收藏代码

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

                                                                               

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。 

 

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

 

第6~第10行:得到参数的Class数组。 

 

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

 

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

 

 

6. 判断是否为某个类的实例 

Java代码  

收藏代码

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

7. 得到数组中的某个元素 

 

Java代码  

收藏代码

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

                                                        

 

附完整源码: 

 

Java代码  

收藏代码

  1. import java.lang.reflect.Array;      
  2. import java.lang.reflect.Constructor;      
  3. import java.lang.reflect.Field;      
  4. import java.lang.reflect.Method;      
  1.      
  2.      
  1. /**    
  2.  * Java Reflection Cookbook    
  3.  *    
  4.  * @author Michael Lee    
  5.  * @since 2006-8-23    
  6.  * @version 0.1a    
  7.  */     
  1.      
  1. public class Reflection {      
  1.     /**    
  1.      * 得到某个对象的公共属性    
  2.      *    
  3.      * @param owner, fieldName    
  4.      * @return 该属性对象    
  5.      * @throws Exception    
  6.      *    
  7.      */     
  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.     }      
  10.      
  11.     /**    
  1.      * 得到某类的静态公共属性    
  2.      *    
  3.      * @param className   类名    
  4.      * @param fieldName   属性名    
  5.      * @return 该属性对象    
  6.      * @throws Exception    
  7.      */     
  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.     }      
  11.      
  12.      
  13.     /**    
  1.      * 执行某对象方法    
  2.      *    
  3.      * @param owner    
  4.      *            对象    
  5.      * @param methodName    
  6.      *            方法名    
  7.      * @param args    
  8.      *            参数    
  9.      * @return 方法返回值    
  10.      * @throws Exception    
  11.      */     
  1.     public Object invokeMethod(Object owner, String methodName, Object[] args)      
  2.             throws Exception {      
  3.      
  4.         Class ownerClass = owner.getClass();      
  5.      
  6.         Class[] argsClass = new Class[args.length];      
  7.      
  8.         for (int i = 0, j = args.length; i < j; i++) {      
  9.             argsClass[i] = args[i].getClass();      
  10.         }      
  11.      
  12.         Method method = ownerClass.getMethod(methodName, argsClass);      
  13.      
  14.         return method.invoke(owner, args);      
  15.     }      
  16.      
  17.      
  18.       /**    
  1.      * 执行某类的静态方法    
  2.      *    
  3.      * @param className    
  4.      *            类名    
  5.      * @param methodName    
  6.      *            方法名    
  7.      * @param args    
  8.      *            参数数组    
  9.      * @return 执行方法返回的结果    
  10.      * @throws Exception    
  11.      */     
  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.     }      
  15.      
  16.      
  17.      
  18.     /**    
  1.      * 新建实例    
  2.      *    
  3.      * @param className    
  4.      *            类名    
  5.      * @param args    
  6.      *            构造函数的参数    
  7.      * @return 新建的实例    
  8.      * @throws Exception    
  9.      */     
  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.     }      
  15.      
  16.      
  17.           
  18.     /**    
  1.      * 是不是某个类的实例    
  2.      * @param obj 实例    
  3.      * @param cls     
  4.      * @return 如果 obj 是此类的实例,则返回 true    
  5.      */     
  1.     public boolean isInstance(Object obj, Class cls) {      
  2.         return cls.isInstance(obj);      
  3.     }      
  4.           
  5.     /**    
  1.      * 得到数组中的某个元素    
  2.      * @param array 数组    
  3.      * @param index 索引    
  4.      * @return 返回指定数组对象中索引组件的值    
  5.      */     
  1.     public Object getByArray(Object array, int index) {      
  2.         return Array.get(array,index);      
  3.     }      
  4. }    
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4778次
    • 积分:76
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档