首页 / 操作系统 / Linux / Java反射之操作目标类中的成员
代码说话。。- package com.jadyer.reflection;
-
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
-
- import com.jadyer.model.Person;
-
- /**
- * 操作目标类中的成员
- */
- public class ProcessTargetClassMember {
- public static void main(String[] a) throws Exception{
- ProcessTargetClassMember test = new ProcessTargetClassMember();
- Person person = new Person("张起灵", 26);
-
- System.out.println("------------------------->>直接操作对象的属性public String name, Integer age");
- test.processObjectField(person, "name", "陈文锦");
- test.processObjectField(person, "age", 27);
- System.out.println(person);
-
- System.out.println("------------------------->>直接操作类的属性public static Integer total = 100");
- test.processClassField("com.jadyer.model.Person", "total", 88);
-
- System.out.println("------------------------->>调用对象的成员方法setAll(String name, Integer age)");
- test.invokeObjectMethod(person, "setAll", new Class[]{String.class, Integer.class}, new Object[]{"吴三省", 99});
- System.out.println(person);
-
- System.out.println("------------------------->>调用类的成员方法showTotal()");
- test.invokeClassMethod("com.jadyer.model.Person", "showTotal", null, null);
- }
-
- /**
- * 直接操作对象的属性
- * @see 这些属性都必须是public的,即访问权限允许的情况下才能被使用
- * @see 否则即使是反射机制,也无法直接访问它们
- */
- public void processObjectField(Object obj, String fieldName, Object newValue) throws NoSuchFieldException, IllegalAccessException {
- Class<?> clazz = obj.getClass(); //获取obj对象的Class对象,它所描述的就是指定类的信息
- Field field = clazz.getField(fieldName); //返回当前clazz类中特定的某一个属性
- Object oldValue = field.get(obj); //获取指定对象的属性值,其实是将fileName的属性值赋给了oldValue
- System.out.println("修改前:" + fieldName + "=" + oldValue);
- field.set(obj, newValue); //设定对象的属性值为指定的值,即设定obj对象的fieldName的属性值为newValue
- System.out.println("修改后:" + fieldName + "=" + field.get(obj));
- }
-
- /**
- * 直接操作类的属性
- * @see 由于在形参中指定了类名,所以能够直接操作类名
- * @see 而processField()方法中指定的是一个对象的引用
- */
- public void processClassField(String className, String fieldName, Object newValue) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
- Class<?> clazz = Class.forName(className);
- Field field = clazz.getField(fieldName);
- Object oldValue = field.get(clazz);
- System.out.println("修改前:" + fieldName + "=" + oldValue);
- field.set(clazz, newValue);
- System.out.println("修改后:" + fieldName + "=" + field.get(clazz));
- }
-
- /**
- * 调用对象的成员方法
- * @param obj---------指定一个对象
- * @param methodName--指定所要调用的该对象的方法名
- * @param argTypes----指定方法的形参
- * @param args--------给定方法的实参
- */
- public void invokeObjectMethod(Object obj, String methodName, Class<?>[] argTypes, Object[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
- Class<?> clazz = obj.getClass(); //获取Class对象
- Method method = clazz.getMethod(methodName, argTypes); //返回某一个特定的方法。需要指定方法名和形参列表
- Object result = method.invoke(obj, args); //调用Method对象对应的方法。若该方法没有返回值,则返回null
- System.out.println("result:" + result);
- }
-
- /**
- * 调用类的成员方法
- */
- public void invokeClassMethod(String className, String methodName, Class<?>[] argTypes, Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
- Class<?> clazz = Class.forName(className);
- Method method = clazz.getMethod(methodName, argTypes);
- Object result = method.invoke(null, args);
- System.out.println("result:" + result);
- }
- }
下面是用到的Person类- package com.jadyer.model;
-
- public class Person {
- public String name;
- public Integer age;
- public static Integer total = 100;
-
- public Person() {
- total++;
- }
-
- public Person(String name, Integer age) {
- this.name = name;
- this.age = age;
- total++;
- }
-
- public void setAll(String name, Integer age){
- this.name = name;
- this.age = age;
- }
-
- public static Integer showTotal(){
- System.out.println("total=" + total);
- return total;
- }
-
- @Override
- public String toString() {
- return "Name:" + name + " Age:" + age;
- }
- }