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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 向阳泪无痕 高级黑马   /  2014-2-25 10:11  /  1747 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么我这样写获取不到构造器,请看下面我写的代码。

  1. import java.lang.reflect.Constructor;
  2. class Text2
  3. {
  4.         public static void main(String[] args)  throws Exception
  5.         {
  6.                 //1,获取该类的字节码
  7.                 Class<Person> clazz = (Class<Person>)Class.forName("Person");

  8.                
  9.                 //3,获取指定的构造器       
  10.                 Constructor<Person> constructor = clazz.getConstructor();       
  11.                
  12.                 constructor.setAccessible(true);//加了这个也不行,为什么找不到无参构造器
  13.                 System.out.println("指定获取:"+constructor);

  14.         }
  15. }

  16. class Person  
  17. {
  18.         private String name;
  19.         public int id;
  20.         Person()    //此处为什么没用public修饰就无法获取,上面使用setAccessible(true);也不行,为什么??
  21.         {
  22.                 System.out.println("无参构造函数");
  23.         }
  24.         public Person(String name,int id)
  25.         {
  26.                 this.name = name;
  27.                 this.id = id;
  28.                 System.out.println("。。。有参构造函数");
  29.         }
  30.         public Person(String s)
  31.         {
  32.                 System.out.println(s);
  33.         }
  34. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

4 个回复

倒序浏览
import java.lang.reflect.Constructor;
class Text2
{
        public static void main(String[] args)  throws Exception
        {
                //1,获取该类的字节码
                Class clazz = Class.forName("Person");//你这里只要写上类的全路径就知道是Person类了

               
                //3,获取指定的构造器        
                Constructor  constructor = clazz.getConstructor(); //这样获取的就是无参构造了     
               
                constructor.setAccessible(true);//加了这个也不行,为什么找不到无参构造器
                System.out.println("指定获取:"+constructor);

        }
}

class Person  
{
        private String name;
        public int id;
        Person()    //此处为什么没用public修饰就无法获取,上面使用setAccessible(true);也不行,为什么??
        {
                System.out.println("无参构造函数");
        }
        public Person(String name,int id)
        {
                this.name = name;
                this.id = id;
                System.out.println("。。。有参构造函数");
        }
        public Person(String s)
        {
                System.out.println(s);
        }
}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
L_t 发表于 2014-2-25 13:04
import java.lang.reflect.Constructor;
class Text2
{

你这改了。。没运行的吧   。。。还是一样的错误。。。。把 Person 类中构造器加上public改成 public Person() 就可以。  是这个问题 。。。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
费时好久终于搞定楼主的这个问题了!楼主好细心啊,我也是第一次发现这个问题!
楼主看API文档,可以看见getConstructors() :返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
用这个方法得到的只能是公共构造方法,也就是用public修饰的构造方法!如果想要获得所有的构造方法可以用:
getDeclaredConstructor(Class<?>... parameterTypes): 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
也就是说楼主只需要将源代码中的getConstructors() 替换成getDeclaredConstructor(Class<?>... parameterTypes)就OK啦!

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
迪兰奇迹 发表于 2014-2-25 20:53
费时好久终于搞定楼主的这个问题了!楼主好细心啊,我也是第一次发现这个问题!
楼主看API文档,可以看见ge ...

非常感谢   明白了。。。。。 把这给忘了  
不过为什么  我下面这么用不行呢?
Constructor<Person> constructor = clazz.getConstructor();        
  constructor.setAccessible(true);  // 设置为可访问私有的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马