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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我反射用的没错啊 怎么会运行出错呢?Field完Method invoke 都调用的没错啊 怎么会出错呢 求高手解答

  1. import java.lang.reflect.*;


  2. /*使用反射的方法来修改自定义类的内部属性。*/

  3. public class Person{
  4.        
  5.                 private String name;
  6.                 private int    age;
  7.                 public Person(){}
  8.                 public Person(String name,int age){
  9.                         this.age=age;
  10.                         this.name=name;
  11.                         show();
  12.                 }
  13.                 public Person(String name){
  14.                         this.name=name;
  15.                         show();
  16.                 }
  17.                 public int getAge(int age) {
  18.                         return age;
  19.                 }
  20.                 public String getName(String name) {
  21.                         return name;
  22.                 }
  23.                 public void setAge(int age) {
  24.                         this.age=age;
  25.                 }
  26.                 public void setName(String name) {
  27.                         this.name=name;
  28.                 }
  29.                 void show()
  30.                 {
  31.                         System.out.println(name+"..."+age);
  32.                 }
  33. }

  34. class PersonDemo{
  35.         public static void main(String[] args) throws Exception, NoSuchMethodException {
  36.                
  37.                 Constructor<Person> constor=Person.class.getConstructor(String.class);
  38.                
  39.                 Person person=constor.newInstance(new String("张三"));//用newInstance初始化指定的构造函数
  40.                
  41.                
  42.                 Method method=Person.class.getMethod("setName", String.class);//获得setName方法
  43.                
  44.                 method.invoke(person, "李四a");//调用setName方法对姓名进行设置
  45.                 Field fields=person.getClass().getDeclaredField("age");//获得指定的成员变量
  46.                 fields.set(person,99);//重新为age赋值
  47.                 person.show();
  48.                 fields.setAccessible(false);//将指定成员变量设置为不可见
  49.         }
  50. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 还是鼓励一下!

查看全部评分

2 个回复

倒序浏览
本帖最后由 李东升 于 2012-8-1 17:29 编辑

public class Person{
        
                private String name;
                private int    age;
                public Person(){}
                public Person(String name,int age){
                        this.age=age;
                        this.name=name;
                        show();
                }
                public Person(String name){
                        this.name=name;
                        show();
                }
                public int getAge(int age) {
                        return age;
                }
                public String getName(String name) {
                        return name;
                }
                public void setAge(int age) {
                        this.age=age;
                }
                public void setName(String name) {
                        this.name=name;
                }
                void show()
                {
                        System.out.println(name+"..."+age);
                }
}
class PersonDemo{
    public static void main(String[] args) throws Exception, NoSuchMethodException {
            
            Constructor<Person> constor=Person.class.getConstructor(String.class);
            
            Person person=constor.newInstance(new String("张三"));//用newInstance初始化指定的构造函数
            
            
            Method method=Person.class.getMethod("setName", String.class);//获得setName方法
            
            method.invoke(person, "李四a");//调用setName方法对姓名进行设置
            Field fields=person.getClass().getDeclaredField("age");//获得指定的成员变量
            fields.setAccessible(true);//我会告诉你我就加了这一行代码么。。            fields.set(person,99);//重新为age赋值
            person.show();
            fields.setAccessible(false);//将指定成员变量设置为不可见
    }
}

我会告诉你我就加了一行代码么。。这一行代码的意思,就是取消通过反射访问属性的权限检查。私有的属性,要访问,不加这个肯定会出错。至于后面你设置为false是什么意思呢,,
回复 使用道具 举报
对私有属性的设置,要将成员可见,即setAccessible(true);,要不然无法设置。
在代码中加一句就好了
Field fields=person.getClass().getDeclaredField("age");//获得指定的成员变量
                fields.setAccessible(true);//成员变量设置为可见
               
                fields.set(person,99);//重新为age赋值

                person.show();

                fields.setAccessible(false);//将指定成员变量设置为不可见
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马