Java反射无法通过类名获取构造函数

3

我有这段代码:

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。您能否帮忙解释一下并提供如何修复的方法?

非常感谢。


1
你是内部类吗? - tsolakp
1
这个例子对我来说完美运作。你能分享一个更精确的例子吗?这段代码片段可能缺少你实际代码中的一些关键因素。 - Mureinik
这是在Ideone上运行的代码。 - Radiodef
3个回答

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的文档:

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

因此,您需要使用以下内容:

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

显然,将Foo替换为您封装类的名称。

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();
        }
    }
}

0

getConstructors() 返回可见的构造函数。尝试使用 getDeclaredConstructors() 或将类设为 public


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接