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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 老貓钓鱼 中级黑马   /  2014-4-12 23:03  /  1009 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个Person类,只有一个带参的构造函数,接收的是(String name, int age)
现反射这个类,得到这个类的构造函数,实例化时遇到了这个问题:newInstance时String可以new,int这个参数如何实现?

Class clazz =  Class.forName("com.test.Person");
Constructor con1 = clazz.getConstructor(String.class, int.class);
Person p1 = (Person)con1.newInstance(new String("张三"), 21);//错误在这个21,  试过用new Integer(21)也不行

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 caijunsong 于 2014-4-12 23:43 编辑

希望你把源代码都给我贴出来 你的情况我也遇到过 但是有好几种可能 我不确定是那种错误!!
有一种可能是 你的类的构造函数是没有用public 修饰  而getConstructor返回的是public修饰构造函数,这样就是出现异常了
回复 使用道具 举报
本帖最后由 老貓钓鱼 于 2014-4-12 23:50 编辑

这是Person类:
  1. package com.test;

  2. import java.io.Serializable;

  3. public class Person implements Serializable{
  4.         /**
  5.          *
  6.          */
  7.         private static final long serialVersionUID = 12345678L;
  8.         /**
  9.          *
  10.          */
  11.         
  12.         private String name;
  13.         private int age;
  14.         Person(String name, int age) {
  15.                 setName(name);
  16.                 setAge(age);
  17.         }
  18.         public void setName(String name) {
  19.                 this.name = name;
  20.         }
  21.         public void setAge(int age) {
  22.                 this.age = age;
  23.         }
  24.         public String getName() {
  25.                 return this.name;
  26.         }
  27.         public int getAge() {
  28.                 return this.age;
  29.         }
  30.         public boolean equals(Object obj) {
  31.                 if(this == obj) {
  32.                         return true;
  33.                 }
  34.                 if(!(obj instanceof Person)) {
  35.                         throw new ClassCastException("类型不一致");
  36.                 }
  37.                 Person per = (Person)obj;
  38.                 return this.name.equals(per.name) && this.age == per.age;
  39.         }
  40.         public String toString() {
  41.                 return "[name=" + name + ",age=" + age + "]";
  42.         }
  43. }
复制代码



反射
  1. package com.test;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;



  6. public class ReflectDemo {

  7.         public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
  8.                 Class clazz =  Class.forName("com.test.Person");
  9.                 /*Field[] field = clazz.getDeclaredFields();
  10.                 for (Field field2 : field) {
  11.                         System.out.println(field2);
  12.                 }
  13.                 Method[] method = clazz.getDeclaredMethods();
  14.                 for (Method method2 : method) {
  15.                         System.out.println(method2);
  16.                 }
  17.                 System.out.println("---------------------");
  18.                 Constructor[] con = clazz.getDeclaredConstructors();
  19.                 for (Constructor constructor : con) {
  20.                         System.out.println(constructor);
  21.                 }
  22.                 System.out.println("---------------------");
  23.                 System.out.println(clazz.getPackage());
  24.                 System.out.println("---------------------");*/
  25.                
  26.                 //中间的代码我都注释掉了,主要是后面这二句
  27.                 Constructor con1 = clazz.getConstructor(String.class, int.class);
  28.                 Person p1 = (Person)con1.newInstance(new String("张三"), 21);//实例化对象

  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1 代码尽量贴主题上

查看全部评分

回复 使用道具 举报

错误应该在21这个传参上,这里要求的参数类型是对象,我就是不知道怎么把int变成一个对象进行传参(试过用Integer)
回复 使用道具 举报
int 和 Integer 不一样
Person 构造函数声明为 Person(String name,int age) 就用    Constructor con1 = clazz.getDeclaredConstructor(String.class, int.class);
Person 构造函数声明为 Person(String name,Integer age) 就用    Constructor con1 = clazz.getDeclaredConstructor(String.class, Integer.class);
回复 使用道具 举报
        Person p1 = (Person)con1.newInstance("test1",21);
你可以都用这句测试
回复 使用道具 举报
你再运行一下程序,仔细看看,你的错误应该不在那,应该是在
Constructor con1 = clazz.getConstructor(String.class, int.class);这行代码上,错误应该提示java.lang.NoSuchMethodException这个异常。
你的Person类里的构造函数不是public,是默认类型的,而getConstructor这个方法得到的都是public型的,所以会找不到,你应该调用getDeclaredConstructor这个方法,这个方法是得到所有声明的构造方法。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
老貓钓鱼 来自手机 中级黑马 2014-4-13 10:28:00
8#
清风夜独醉 发表于 2014-4-13 00:40
你再运行一下程序,仔细看看,你的错误应该不在那,应该是在
Constructor con1 = clazz.getConstructor(Str ...

果然是这个原因,把构造函数改成public或使用暴力就好了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马