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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张学东 中级黑马   /  2012-10-27 23:52  /  1277 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima.fans;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;

  4. public class Demo4 {

  5.         /**
  6.          * 通过Class调用其他类中的构造函数 ,
  7.          * 也可以通过这种方式通过Class创建其他类的对象
  8.          */
  9.         public static void main(String[] args) {
  10.                 Class demo=null;
  11.                 try {
  12.                         demo=Class.forName("com.itheima.fans.Person");
  13.                 } catch (ClassNotFoundException e) {
  14.                         // TODO Auto-generated catch block
  15.                         e.printStackTrace();
  16.                 }
  17.                 Person per1=null;
  18.                 Person per2=null;
  19.                 Person per3=null;
  20.                 Person per4=null;
  21.                 //取得全部的构造函数
  22.                 Constructor<?> cons[]=demo.getConstructors();
  23.                  System.out.println(cons.length);
  24.                 try {
  25.                         per1=(Person)cons[0].newInstance();
  26.                         per2=(Person)cons[1].newInstance("zhangsan");
  27.                         per3=(Person)cons[2].newInstance(25);
  28.                         per4=(Person)cons[3].newInstance("zhangsan",25);
  29.                        
  30.                 } catch (IllegalArgumentException e) {
  31.                         // TODO Auto-generated catch block
  32.                         e.printStackTrace();
  33.                 } catch (InstantiationException e) {
  34.                         // TODO Auto-generated catch block
  35.                         e.printStackTrace();
  36.                 } catch (IllegalAccessException e) {
  37.                         // TODO Auto-generated catch block
  38.                         e.printStackTrace();
  39.                 } catch (InvocationTargetException e) {
  40.                         // TODO Auto-generated catch block
  41.                         e.printStackTrace();
  42.                 }
  43.                 System.out.println(per1);
  44.                 System.out.println(per2);
  45.                 System.out.println(per3);
  46.                 System.out.println(per4);
  47.                

  48.         }

  49. }
  50. class Person{
  51.         private String name;
  52.         private int age;
  53.         public Person() {
  54.     }

  55.     public Person(String name){
  56.         this.name=name;
  57.     }

  58.     public Person(int age){

  59.         this.age=age;

  60.     }

  61.     public Person(String name, int age) {

  62.         this.age=age;

  63.         this.name=name;}
  64.         public String getName() {
  65.                 return name;
  66.         }
  67.         public void setName(String name) {
  68.                 this.name = name;
  69.         }
  70.         public int getAge() {
  71.                 return age;
  72.         }
  73.         public void setAge(int age) {
  74.                 this.age = age;
  75.         }
  76.         public String toString(){
  77.                 return "["+this.name+" "+this.age+"]";
  78.         }
  79. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

4 个回复

正序浏览
for(Constructor constructor:cons){
                        System.out.println(constructor);
                }
可以查看构造方法顺序是:
public Person()
public Person(java.lang.String,int)
public Person(int)
public Person(java.lang.String)
就可以发现你的构造方法的传参错了
回复 使用道具 举报
本帖最后由 徐升兴 于 2012-10-28 17:18 编辑


从提示中可以看出,第一个错误是因为找不到你所要获取的字节码的类
第二个错误是是说空指针异常,先不要管
所以要改一下15行的demo=Class.forName("com.itheima.fans.Person");
把前面的包名去掉

修改完这个之后,你会发现编译没错了,但是运行会报异常
异常的意思是传入了错误的参数列表,也就是你创建对象的时候传入参数错误

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
..............
回复 使用道具 举报
怎么就沉了呢??
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马