A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

package cn.itcast_01;
import java.lang.reflect.Field;
//这是工具类
//通过一个方法反射为Object obj对象的propertyName属性设置为value;
public class Tool {
public void setProperty(Object obj, String propertyName,Object value)
   throws NoSuchFieldException, SecurityException,
   IllegalArgumentException, IllegalAccessException {
  // 获取字节码文件对象
  Class c = obj.getClass();
  // 获取成员变量
  Field nameField = c.getDeclaredField("propertyName");
  // 取消检查
  nameField.setAccessible(true);
  // 赋值
  nameField.set(obj, value);
}
}

package cn.itcast_01;
//这是测试类
public class ObjectDemo {
public static void main(String[] args) throws NoSuchFieldException,
SecurityException, IllegalArgumentException, IllegalAccessException {
  Person p=new Person();
  
  Tool t=new Tool();
  t.setProperty(p,"name", "林青霞");
  
  System.out.println(p);
}
}


5 个回复

倒序浏览
Exception in thread "main" java.lang.NoSuchFieldException: propertyName
        at java.lang.Class.getDeclaredField(Unknown Source)
        at cn.itcast_01.Tool.setProperty(Tool.java:14)
        at cn.itcast_01.ObjectDemo.main(ObjectDemo.java:9)
回复 使用道具 举报
dubei1993 发表于 2016-6-2 11:45
Exception in thread "main" java.lang.NoSuchFieldException: propertyName
        at java.lang.Class.getDecla ...

把Person类放出来
回复 使用道具 举报

package cn.itcast_01;
//这是测试类
public class ToolDemo {
        public static void main(String[] args) throws NoSuchFieldException,
        SecurityException, IllegalArgumentException, IllegalAccessException {
                Person p=new Person();
               
                Tool t=new Tool();
                t.setProperty(p,"name", "林青霞");
                t.setProperty(p, "age", 27);
                System.out.println(p);
        }
}
class Person{
        private String name;
        private int age;
        @Override
        public String toString() {
                return "Person [age=" + age + "]";
        }
       
}

错误类型不变
回复 使用道具 举报
dubei1993 发表于 2016-6-2 12:34
package cn.itcast_01;
//这是测试类
public class ToolDemo {

获取成员变量名中的方法中,参数的引号去掉
原本是这样的 Field nameField = c.getDeclaredField("propertyName");

正确是这样的 Field nameField = c.getDeclaredField(propertyName);

你加了引号,所以变成字符串了,而你本意应该是想取参数的value的
回复 使用道具 举报
不能去掉,因为要拿的是字符串类型的成员属性,所以必须加上;并且,成员属性本身是私有的,所以不行。风清扬老师的视频,我自认为是一模一样的,但结果却不对
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马