【问题标题】:Java reflection get constructor from class name failed [closed]Java反射从类名获取构造函数失败[关闭]
【发布时间】:2018-11-09 15:50:08
【问题描述】:

我有这个代码 sn-p:

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。您能帮忙解释一下以及如何解决吗?

非常感谢。

【问题讨论】:

  • You 和内部类吗?
  • 这个例子非常适合我。你能分享一个更确切的例子吗?这个 sn-p 可能在您的实际代码中缺少一些关键因素

标签: java class reflection constructor


【解决方案1】:

如果不是这样,我会删除这个答案,但看起来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#getConstructordocumentation

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

因此,您必须改用以下内容:

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

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

【讨论】:

    【解决方案2】:

    如果You 真的是一个内部类,那么你需要让它的构造函数有点不同。

    这是来自Class.getConstructor的Javadoc sn-p

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

    这意味着您还需要将封闭类传递给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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      getConstructors() 返回可见的构造函数。尝试getDeclaredConstructors() 或创建课程public

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 2017-05-30
        相关资源
        最近更新 更多