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 + "/tAge:" + age; } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值