Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java反射从类名获取构造函数失败_Java_Class_Reflection_Constructor - Fatal编程技术网

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

Java反射从类名获取构造函数失败,java,class,reflection,constructor,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[] pa

我有以下代码片段:

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。请您解释一下,以及如何修复


非常感谢。

如果不是这样的话,我会删除这个答案,但是看起来
您是一个内部类,我怀疑您的实际代码是这样的:

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?
    }
}
类的#getConstructor

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();
        }
    }
}
如果该类对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式封闭实例作为第一个参数

因此,您必须使用以下选项:

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

但是显然,用封闭类的名称替换
Foo

如果
您确实是一个内部类,那么您需要以稍微不同的方式获取其构造函数

下面是来自

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

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

下面是一个示例(包括如何从其
构造函数创建内部类的实例):


getConstructors()
返回可视构造函数。尝试
getDeclaredConstructors()
或将类
公开

您和内部类吗?这个示例非常适合我。你能举一个更确切的例子吗?此代码段可能缺少实际代码中的一些关键因素