Java反射之操作目标类中的成员


代码说话。。
  1. package com.jadyer.reflection;   
  2.   
  3. import java.lang.reflect.Field;   
  4. import java.lang.reflect.InvocationTargetException;   
  5. import java.lang.reflect.Method;   
  6.   
  7. import com.jadyer.model.Person;   
  8.   
  9. /**  
  10.  * 操作目标类中的成员  
  11.  */  
  12. public class ProcessTargetClassMember {   
  13.     public static void main(String[] a) throws Exception{   
  14.         ProcessTargetClassMember test = new ProcessTargetClassMember();   
  15.         Person person = new Person("张起灵"26);   
  16.   
  17.         System.out.println("------------------------->>直接操作对象的属性public String name, Integer age");   
  18.         test.processObjectField(person, "name""陈文锦");   
  19.         test.processObjectField(person, "age"27);   
  20.         System.out.println(person);   
  21.            
  22.         System.out.println("------------------------->>直接操作类的属性public static Integer total = 100");   
  23.         test.processClassField("com.jadyer.model.Person""total"88);   
  24.            
  25.         System.out.println("------------------------->>调用对象的成员方法setAll(String name, Integer age)");   
  26.         test.invokeObjectMethod(person, "setAll"new Class[]{String.class, Integer.class}, new Object[]{"吴三省"99});   
  27.         System.out.println(person);   
  28.            
  29.         System.out.println("------------------------->>调用类的成员方法showTotal()");   
  30.         test.invokeClassMethod("com.jadyer.model.Person""showTotal"nullnull);   
  31.     }   
  32.        
  33.     /**  
  34.      * 直接操作对象的属性  
  35.      * @see 这些属性都必须是public的,即访问权限允许的情况下才能被使用  
  36.      * @see 否则即使是反射机制,也无法直接访问它们  
  37.      */  
  38.     public void processObjectField(Object obj, String fieldName, Object newValue) throws NoSuchFieldException, IllegalAccessException {   
  39.         Class<?> clazz = obj.getClass(); //获取obj对象的Class对象,它所描述的就是指定类的信息   
  40.         Field field = clazz.getField(fieldName); //返回当前clazz类中特定的某一个属性   
  41.         Object oldValue = field.get(obj); //获取指定对象的属性值,其实是将fileName的属性值赋给了oldValue   
  42.         System.out.println("修改前:" + fieldName + "=" + oldValue);   
  43.         field.set(obj, newValue); //设定对象的属性值为指定的值,即设定obj对象的fieldName的属性值为newValue   
  44.         System.out.println("修改后:" + fieldName + "=" + field.get(obj));         
  45.     }   
  46.        
  47.     /**  
  48.      * 直接操作类的属性  
  49.      * @see 由于在形参中指定了类名,所以能够直接操作类名  
  50.      * @see 而processField()方法中指定的是一个对象的引用  
  51.      */  
  52.     public void processClassField(String className, String fieldName, Object newValue) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {   
  53.         Class<?> clazz = Class.forName(className);   
  54.         Field field = clazz.getField(fieldName);   
  55.         Object oldValue = field.get(clazz);   
  56.         System.out.println("修改前:" + fieldName + "=" + oldValue);   
  57.         field.set(clazz, newValue);   
  58.         System.out.println("修改后:" + fieldName + "=" + field.get(clazz));   
  59.     }      
  60.   
  61.     /**  
  62.      * 调用对象的成员方法  
  63.      * @param obj---------指定一个对象  
  64.      * @param methodName--指定所要调用的该对象的方法名  
  65.      * @param argTypes----指定方法的形参  
  66.      * @param args--------给定方法的实参  
  67.      */  
  68.     public void invokeObjectMethod(Object obj, String methodName, Class<?>[] argTypes, Object[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {   
  69.         Class<?> clazz = obj.getClass(); //获取Class对象   
  70.         Method method = clazz.getMethod(methodName, argTypes); //返回某一个特定的方法。需要指定方法名和形参列表   
  71.         Object result = method.invoke(obj, args); //调用Method对象对应的方法。若该方法没有返回值,则返回null   
  72.         System.out.println("result:" + result);   
  73.     }   
  74.        
  75.     /**  
  76.      * 调用类的成员方法  
  77.      */  
  78.     public void invokeClassMethod(String className, String methodName, Class<?>[] argTypes, Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {   
  79.         Class<?> clazz = Class.forName(className);   
  80.         Method method = clazz.getMethod(methodName, argTypes);   
  81.         Object result = method.invoke(null, args);   
  82.         System.out.println("result:" + result);   
  83.     }   
  84. }  

下面是用到的Person类

  1. package com.jadyer.model;   
  2.   
  3. public class Person {   
  4.     public String name;   
  5.     public Integer age;   
  6.     public static Integer total = 100;   
  7.        
  8.     public Person() {   
  9.         total++;   
  10.     }   
  11.        
  12.     public Person(String name, Integer age) {   
  13.         this.name = name;   
  14.         this.age = age;   
  15.         total++;   
  16.     }   
  17.        
  18.     public void setAll(String name, Integer age){   
  19.         this.name = name;   
  20.         this.age = age;   
  21.     }   
  22.        
  23.     public static Integer showTotal(){   
  24.         System.out.println("total=" + total);   
  25.         return total;   
  26.     }   
  27.        
  28.     @Override  
  29.     public String toString() {   
  30.         return "Name:" + name + "\tAge:" + age;   
  31.     }   
  32. }  

相关内容