黑马程序员技术交流社区

标题: 反射的编译问题【解决了】 [打印本页]

作者: 王红霞    时间: 2012-8-3 17:03
标题: 反射的编译问题【解决了】
本帖最后由 王红霞 于 2012-8-3 17:20 编辑

class Person{
        private String name;
        private int age;
        public Person(String name,int age){
                this.name=name;
                this.age=age;
        }
        public String getName(){
                return name;
        }
        public int getAge(){
                return age;
        }
public class reflect {
        public static void main(String[] args) throws Exception {
                 Constructor<;Person> cons = Person.class.getConstructor(String.class,int.class);
                        
                        Person p1=(Person)cons.newInstance("lisi",13);//获取实例               
                        System.out.println(p1.getName()+":"+p1.getAge());  
               
                        //利用反射的方式调用方法获取属性值
                        Method methodsetName = Person.class.getMethod("setName", String.class);
                        methodsetName.invoke(p1, "lisi");
                        Field fieldAge=p1.getClass().getField("age");//提示空指针异常?如何解决
                        fieldAge.setInt(p1, 30);        
                        System.out.println(p1.getName()+":"+p1.getAge());
  }        
}


作者: 王渠    时间: 2012-8-3 17:11
本帖最后由 王渠 于 2012-8-3 17:14 编辑

你的Person类没有setName(String name){}这个方法吧。

你的Person中的age属性是私有的,私有的无法直接获取吧。
作者: 王红霞    时间: 2012-8-3 17:19
王渠 发表于 2012-8-3 17:11
你的Person类没有setName(String name){}这个方法吧。

你的Person中的age属性是私有的,私有的无法直接获 ...

额  倒是有set方法   不过还真是你帮忙了啊~
作者: 樊占江    时间: 2012-8-3 17:21
你的 “AGE”是私有的吧
作者: 黑马振鹏    时间: 2012-8-3 17:22
  1. mport java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;


  4. public class Reflect {
  5.         public static void main(String []args) throws Exception {
  6.              Constructor<Person> cons = Person.class.getConstructor(String.class,int.class);
  7.                     
  8.                     Person p1=(Person)cons.newInstance("lisi",13);//获取实例               
  9.                     System.out.println(p1.getName()+":"+p1.getAge());  
  10.             
  11.                     //利用反射的方式调用方法获取属性值
  12.                     //应该在person中定义方法setName();
  13.                     Method methodsetName = Person.class.getMethod("setName", String.class);
  14.                     System.out.println("---");
  15.                     methodsetName.invoke(p1, "lisi");
  16.                     //私有变量访问需要用到getDeclaredField()
  17.                     Field fieldAge=p1.getClass().getDeclaredField("age");//提示空指针异常?如何解决
  18.                     //传说中的暴力反射 呵呵
  19.                     fieldAge.setAccessible(true);
  20.                     fieldAge.setInt(p1, 30);        
  21.                     System.out.println(p1.getName()+":"+p1.getAge());
  22.     }        
  23. }
  24. class Person{
  25.     private String name;
  26.     private int age;
  27.     public Person(String name,int age){
  28.             this.name=name;
  29.             this.age=age;
  30.     }
  31.     public void setName(String name) {
  32.                 this.name = name;
  33.         }
  34.         public void setAge(int age) {
  35.                 this.age = age;
  36.         }
  37.         public String getName(){
  38.             return name;
  39.     }
  40.     public int getAge(){
  41.             return age;
  42.     }
  43. }
复制代码
两点需要注意:
1.反射中的方法应该如何使用
2.私有变量需要进行特殊处理




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