黑马程序员技术交流社区

标题: 今天跟反射干上了,各种错误。。修改成员变量属性又错了 [打印本页]

作者: dubei1993    时间: 2016-6-2 11:42
标题: 今天跟反射干上了,各种错误。。修改成员变量属性又错了
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);
}
}



作者: dubei1993    时间: 2016-6-2 11:45
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)

作者: 土菠萝    时间: 2016-6-2 12:05
dubei1993 发表于 2016-6-2 11:45
Exception in thread "main" java.lang.NoSuchFieldException: propertyName
        at java.lang.Class.getDecla ...

把Person类放出来
作者: dubei1993    时间: 2016-6-2 12:34
土菠萝 发表于 2016-6-2 12:05
把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 + "]";
        }
       
}

错误类型不变
作者: 土菠萝    时间: 2016-6-2 15:45
dubei1993 发表于 2016-6-2 12:34
package cn.itcast_01;
//这是测试类
public class ToolDemo {

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

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

你加了引号,所以变成字符串了,而你本意应该是想取参数的value的
作者: dubei1993    时间: 2016-6-2 17:55
不能去掉,因为要拿的是字符串类型的成员属性,所以必须加上;并且,成员属性本身是私有的,所以不行。风清扬老师的视频,我自认为是一模一样的,但结果却不对




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2