黑马程序员技术交流社区

标题: 实在搞不懂.这代码哪里出错了 [打印本页]

作者: 陈泽鑫    时间: 2012-12-18 22:12
标题: 实在搞不懂.这代码哪里出错了
本帖最后由 陈泽鑫 于 2012-12-19 15:16 编辑

本来不想来求助的...来了就证明自己挺弱的{:soso_e136:}
但是我实在找不出问题原因,希望有人能指出.

import java.lang.reflect.Constructor;

public class reflect{
    public static void main(String[] args) {
        try {
            //这种方法运行报错
//            Constructor cons = Person.class.getConstructor(String.class, int.class);//获得类的构造器
            //这种方法运行也报错
//            Constructor cons = Class.forName("com.itheima.Person").getConstructor(String.class,int.class);

            Person person = (Person)cons.newInstance("张三", 90);//通过通过构造器创建构造方法赋初始值
            
            Person.class.getMethod("setName", String.class).invoke(person,"李四");//调用方法赋值
            
            Person.class.getField("age").set(person, 22);//直接对属性赋值
            
            System.out.println(person);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }   
}

class Person {
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }
   
    public String toString(){
        return "姓名: "+name+"; 年龄: "+age;
    }
   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
   
    private String name;
    private int age;
}


作者: 王中利    时间: 2012-12-18 22:39
import java.lang.reflect.Constructor;

public class reflect{
     public static void main(String[] args) {
         try {
             //这种方法运行报错
          Constructor cons = Person.class.getConstructor(String.class, int.class);//获得类的构造器
             //这种方法运行也报错
          // Constructor cons = Class.forName("com.itheima.Person").getConstructor(String.class,int.class);

            Person person = (Person)cons.newInstance("张三", 90);//通过通过构造器创建构造方法赋初始值
            
             Person.class.getMethod("setName", String.class).invoke(person,"李四");//调用方法赋值
            
             Person.class.getField("age").set(person, 22);//直接对属性赋值//这地方得到的是public修饰的字段,可是你的这个字段是private的必须用暴力反射。
            
             System.out.println(person);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }   
}

class Person {
    public Person(String name,int age){//这里的构造函数必须是public的,然后,如果不写会是默认的,默认的权限,想必你也清楚
         this.name = name;
         this.age = age;
     }
     
    public String toString(){
         return "姓名: "+name+"; 年龄: "+age;
     }
     
    public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     public int getAge() {
         return age;
     }
     public void setAge(int age) {
         this.age = age;
     }
     
    private String name;
     private int age;
}


上面的已经标注过了,别的地方都对
作者: 王振    时间: 2012-12-18 22:40
  1. import java.lang.reflect.Constructor;

  2. public class ReflectDemo{
  3.     public static void main(String[] args) {
  4.         try {
  5.             //这种方法运行报错
  6.             Constructor cons = Person.class.getConstructor(String.class, int.class);//获得类的构造器
  7.             /*
  8.              * getConstructor()返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
  9.              * 需要将构造方法指定为public才可以。
  10.              *
  11.              * 另外,下面Person.class.getField("age").set(person, 22);
  12.              * 也会出错,因为age属性是private的,运行出错。
  13.              * 只能是类或接口的指定公共成员字段。
  14.              */
  15.                
  16.             //这种方法运行也报错
  17. //            Constructor cons = Class.forName("com.itheima.Person").getConstructor(String.class,int.class);

  18.             Person person = (Person)cons.newInstance("张三", 90);//通过通过构造器创建构造方法赋初始值
  19.             
  20.             Person.class.getMethod("setName", String.class).invoke(person,"李四");//调用方法赋值
  21.             
  22.             Person.class.getField("age").set(person, 22);//直接对属性赋值
  23.             
  24.             System.out.println(person);
  25.             
  26.             
  27.         } catch (Exception e) {
  28.             e.printStackTrace();
  29.         }
  30.     }   
  31. }


  32. class Person {
  33.     public Person(String name,int age){
  34.         this.name = name;
  35.         this.age = age;
  36.     }
  37.    
  38.     public String toString(){
  39.         return "姓名: "+name+"; 年龄: "+age;
  40.     }
  41.    
  42.     public String getName() {
  43.         return name;
  44.     }
  45.     public void setName(String name) {
  46.         this.name = name;
  47.     }
  48.     public int getAge() {
  49.         return age;
  50.     }
  51.     public void setAge(int age) {
  52.         this.age = age;
  53.     }
  54.    
  55.     public String name;
  56.     public int age;
  57. }
复制代码

作者: 陈泽鑫    时间: 2012-12-18 23:16
王中利 发表于 2012-12-18 22:39
import java.lang.reflect.Constructor;

public class reflect{

因为构造的地方出错还没测试到暴力反射的地方..不过谢谢你了...恍然大悟




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