Java反射从类名获取构造函数失败

时间:2018-11-09 15:50:08

标签: java class reflection constructor

我有以下代码段:

class You{
    public You(String s){}
}

public static void main(String[] args)  throws NoSuchMethodException {
    Constructor[] constructors = You.class.getConstructors();
    for(Constructor constructor: constructors){
        Class[] parameterTypes = constructor.getParameterTypes();
        for(Class c: parameterTypes){
            System.out.println(c.getName());//print java.lang.String
        }
    }
    Constructor constructor =
            You.class.getConstructor(String.class);//NoSuchMethodException?
}

这很老了,当我打印构造函数时,它有一个以java.lang.String作为参数的构造函数。但是当我尝试You.class.getConstructor时,它说没有以String.class作为参数的构造函数。

我在Mac上使用 java1.8 。您能帮您解释以及如何解决吗?

非常感谢。

3 个答案:

答案 0 :(得分:3)

如果不是这种情况,我将删除此答案,但看起来You是一个内部类,并且我怀疑您的实际代码看起来像这样:

public class Foo {

    class You {
        public You(String s){}
    }

    public static void main(String[] args)  throws NoSuchMethodException {
        Constructor[] constructors = You.class.getConstructors();

        for (Constructor constructor: constructors) {
            Class[] parameterTypes = constructor.getParameterTypes();

            for (Class c: parameterTypes){
                System.out.println(c.getName());//print java.lang.String
            }
        }

        Constructor constructor =
            You.class.getConstructor(String.class);//NoSuchMethodException?
    }
}

来自Class#getConstructor的{​​{3}}:

  

如果此Class对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式的封闭实例作为第一个参数。

由于这个原因,您将不得不使用以下内容:

Constructor constructor = You.class.getConstructor(Foo.class, String.class);

但是显然Foo替换为您的封闭类的名称。

答案 1 :(得分:2)

如果You确实是一个内部类,那么您需要使它的构造函数有所不同。

这是Class.getConstructor

的Javadoc代码段
  

如果此Class对象表示在   非静态上下文,形式参数类型包括显式   将实例作为第一个参数。

这意味着您还需要将封闭的类传递给Class.getConstructor调用。

这里是一个示例(包括如何从其Constructor创建内部类的实例):

public class Test {
    class You{
        public You(String s){}
    }

    public static void main(String[] args)  throws NoSuchMethodException {
        Constructor constructor =
                You.class.getConstructor(Test.class, String.class);//NoSuchMethodException?

        try {
            You you = constructor.newInstance(new Test(), "");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

答案 2 :(得分:0)

getConstructors()返回可见的构造函数。尝试getDeclaredConstructors()或制作public类。