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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-2-22 12:41  /  1288 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李挺 于 2013-2-27 16:45 编辑
  1. package day27;

  2. import java.lang.reflect.Constructor;

  3. public class Test2 {

  4.         /**
  5.          * @param args
  6.          * @throws Exception
  7.          * @throws InstantiationException
  8.          */
  9.         public static void main(String[] args) throws InstantiationException, Exception {
  10.                 // TODO Auto-generated method stub
  11.                 Constructor<Person> constructor=Person.class.getConstructor(String.class,int.class);
  12.                 Person p=constructor.newInstance("zhangsan",24);
  13.                 System.out.println(p);
  14.                
  15.         }

  16. }
  17. class Person{
  18.         private String name;
  19.         private int age;
  20.         Person(String name,int age){
  21.                 this.name=name;
  22.                 this.age=age;
  23.         }
  24.         
  25.         public String getName() {
  26.                 return name;
  27.         }
  28.         public void setName(String name) {
  29.                 this.name = name;
  30.         }
  31.         public int getAge() {
  32.                 return age;
  33.         }
  34.         public void setAge(int age) {
  35.                 this.age = age;
  36.         }
  37.         @Override
  38.         public String toString(){
  39.                 return name+"==="+age;
  40.                
  41.         }
  42. }
复制代码
一运行就抛异常

是不是 int.class没有这个字节码啊?写Integer.class也不行

3 个回复

倒序浏览
你Person类中的构造函数,要声明为public才行
因为getConstructor(Class[] params) 和getConstructors()仅仅可以获取到public的构造函数。
或者你在获取构造函数的时候选用getDeclaredConstructors(),这个方法则可以获取到所有的构造函数。
但是调用这个方法的话,要注意安全检查,如果获取的构造函数是public或者是默认权限(即friendly),则不用setAccessible(true)也能正常运行
如果获取的构造函数是private的话,就会抛出java.lang.IllegalAccessException
看看下面的简化代码
  1. package cn.itcast;

  2. import java.lang.reflect.Constructor;

  3. class Constructortest {
  4.          public static void main(String[] args) throws InstantiationException, Exception {

  5.          // TODO Auto-generated method stub

  6.          Constructor<Person> constructor=Person.class.getDeclaredConstructor(String.class,int.class);
  7.          constructor.setAccessible(true);//private权限的构造函数需要安全检查
  8.          Person p=constructor.newInstance("zhangsan",24);

  9.          System.out.println(p);

  10.          

  11. }



  12. }

  13. class Person{

  14.     private String name;

  15.     private int age;

  16.    private Person(String name,int age){  //这里构造函数声明为private

  17.             this.name=name;

  18.             this.age=age;

  19.     }

  20.    
  21.     @Override

  22.     public String toString(){

  23.             return name+"==="+age;

  24.             

  25.     }

  26. }
复制代码
回复 使用道具 举报
你调用的是getConstructor方法,API中说得很清楚。该方法返回与指定的 parameterTypes 相匹配的公共构造方法的 Constructor 对象。
解决办法:
第一种方法:将你的构造方法修饰为public类型的。
第二种方法:将getConstructor方法改为getDeclaredConstructor。
补充:
如果你的构造方法修饰为private类型的,获取构造方法必须用getDeclaredConstructor方法。而且你必须调用setAccessible方法,将反射出来的构造方法设置为允许访问,否则就会出现“IllegalAccessException”。
Filed的反射和Method的反射与此类似。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马