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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪小照 中级黑马   /  2012-10-13 18:44  /  2106 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汪小照 于 2012-10-15 00:33 编辑

此程序是通过反射拿内部类构造函数的代码:
import java.lang.reflect.*;
public class Test1 {
public static void main(String[] args) throws Exception
{
  Class cls = Test1.Person.class;
  System.out.println(cls);//这句话的打印说明已经拿到了内部类的字节码对象。
  Constructor con = cls.getConstructor(null);
  System.out.println(con.getName());
  System.out.println(con.getModifiers());
}
//内部类
class Person{
  private String name;
     public Person(){}
}
}
问什么会抛出java.lang.NoSuchMethodException 异常呢?求解释?难道反射不能拿内部类的东西,只能拿外部类的东西?!

评分

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

查看全部评分

10 个回复

正序浏览
徐梦侠 发表于 2012-10-14 12:46
因为getConstructors是获得所有的公共构造方法,不管这个构造方法传入的是什么参数,getConstructors都能获 ...

谢谢,我知道了:lol
回复 使用道具 举报
因为getConstructors是获得所有的公共构造方法,不管这个构造方法传入的是什么参数,getConstructors都能获得。而getConstructor()则只能获得指定参数的构造方法。例如:
public class Test10 {
public static void main(String[] args) throws Exception
{
     Class cls = Test10.Person.class;
     System.out.println(cls.getName());
     //获得传入参数name的构造函数
     Constructor con = cls.getConstructor(Test10.class,String.class);
   //获得参数name和age的构造函数
     Constructor con1 = cls.getConstructor(Test10.class,String.class,int.class);
    //获得所有的公共构造函数
     Constructor[] con2 = cls.getConstructors();
     System.out.println("con构造函数的参数类型------------");
     System.out.println(con.toString());
     System.out.println("con1构造函数的参数类型---------");
     System.out.println(con1.toString());
     System.out.println("con2构造函数的参数类型----------");
     for(Constructor c : con2){
      System.out.println(c.toString());
     }
}
//内部类
public class Person{
   public Person(){}
   public Person(String name){}
   public Person(String name,int age){}
      private String name;
}
}
回复 使用道具 举报
徐梦侠 发表于 2012-10-13 22:29
实例化内部类反射需要所以传入外部类class对象。
在api中写着如果“此 Class 对象表示非静态上下文中声明的 ...

那为什么getConstructors,这个构造函数不需要传入Test1.class这个参数呢?
回复 使用道具 举报
那为什么getConstructors,这个构造函数不需要传入Test1.class这个参数呢?
回复 使用道具 举报
实例化内部类反射需要所以传入外部类class对象。
在api中写着如果“此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。 ”,官方文档解释“include the explicit enclosing instance as the first parameter.”,
class Test1 {
public static void main(String[] args) throws Exception
{
    Class cls = Test1.Person.class;
    System.out.println(cls.getName());//这句话的打印说明已经拿到了内部类的字节码对象。
    Constructor con = cls.getConstructor(Test1.class); //对于非静态内部类,此处需要传入外部类class对象
    System.out.println(con.getName());
    System.out.println(con.getModifiers());
}
//内部类
public class Person{
  public Person(){}
     private String name;
      
}
}

点评

同意你的解释,中文api太晦涩难懂,还是英文表达的清楚些。  发表于 2012-10-13 22:54

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
汪小照 发表于 2012-10-13 19:42
构造函数只有一个,我不使用getConstructors ,而使用getConstructor就不行呢

构造函数只有一个的话,用cls.getConstructors()[0];
回复 使用道具 举报
我刚才也纠结了挺长时间,同问
回复 使用道具 举报
构造函数只有一个,我不使用getConstructors ,而使用getConstructor就不行呢
回复 使用道具 举报
能不能说一下为什么用getConstructor不行呢
回复 使用道具 举报
  1. import java.lang.reflect.*;
  2. public class Test1 {
  3. public static void main(String[] args) throws Exception
  4. {
  5.   Class cls = Test1.Person.class;
  6.   System.out.println(cls);//这句话的打印说明已经拿到了内部类的字节码对象。
  7.   Constructor[] c = cls.getDeclaredConstructors();
  8.   for(int i = 0; i < c.length; i++){
  9.           Constructor cstr = c[i];
  10.           System.out.println(c[i].getName());
  11.           System.out.println(c[i].getModifiers());
  12.   }
  13.   
  14.   //
  15. }
  16. //内部类
  17. class Person{
  18.   private String name;
  19.   
  20.      public Person(){}
  21. }
  22. }
复制代码
这样写就可以了

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马