首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA getConstructor抛出NoSuchMethodException

JAVA getConstructor抛出NoSuchMethodException
EN

Stack Overflow用户
提问于 2015-03-22 21:37:43
回答 2查看 13.3K关注 0票数 10

我是JAVA新手,我正在努力学习reflection。我想从我的类中获取特定的构造函数(选择示例表单here):

代码语言:javascript
复制
public class Example1 {
    public Example1() {
    }

    public Example1(int i) {
    }

    public Example1(String s) {
        System.out.println("using param = " + s);
    }

    public static void main(String[] args) throws Exception {  
        Class<?>[] paramTypes = String.class.getClasses();
        Constructor<Example1> ctor = Example1.class.getConstructor(paramTypes);
        ctor.newInstance("test");
    }
}

我在尝试实例化ctor时得到NoSuchMethodException

这里我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-22 21:46:40

工作示例:

代码语言:javascript
复制
import java.lang.reflect.Constructor;

public class Test {
    public Test(String str) {
        System.out.println(str);
    }

    public Test(int a, int b) {
        System.out.println("Sum is " + (a + b));
    }

    public static void main(String[] args) throws Exception {
        Constructor<Test> constructorStr = Test.class.getConstructor(String.class);
        constructorStr.newInstance("Hello, world!");

        Constructor<Test> constructorInts = Test.class.getConstructor(int.class, int.class);
        constructorInts.newInstance(2, 3);
    }
}

请注意,方法getConstructor实际上并不接受数组。它的定义如下:

代码语言:javascript
复制
public Constructor<T> getConstructor(Class<?>... parameterTypes) {

..。这意味着它接受可变数量的参数,这些参数应该像我一样传递。传递数组也是可能的,但这不是必需的。

您最初所做的相当于:

代码语言:javascript
复制
    Constructor<Test> constructor = Test.class.getConstructor(String.class.getClasses());
    constructor.newInstance("Hello");

但是,String.class.getClasses()返回什么呢?问得好!让我们开始调试:

代码语言:javascript
复制
    Class<?>[] classes = String.class.getClasses();
    System.out.println(classes.length); // prints 0

有一个关于getClasses()的文档:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClasses。检查一下,你就会知道为什么会这样了。

为了完整起见。超原始问题(在编辑之前)又包含了一个构造器--一个非参数构造器:

代码语言:javascript
复制
import java.lang.reflect.Constructor;

public class Example1 {
    public Example1() {
    }

    public Example1(String s) {
        System.out.println("using param = " + s);
    }

    public static void main(String[] args) throws Exception {  
        Constructor<Example1> ctor = Example1.class.getConstructor(String.class.getClasses());
        ctor.newInstance("test");
    }
}

这里出现的问题是抛出了IllegalArgumentException。这是因为即使String.class.getClasses()返回一个空数组,实际上也有符合条件的构造函数--一个非参数构造函数!它没有任何参数,String.class.getClasses()返回的数组也不包含任何内容。这意味着成功地找到了构造函数,但是当尝试使用ctor.newInstance("test")实例化它时,它失败了,因为找到的构造函数接受任何参数。

票数 10
EN

Stack Overflow用户

发布于 2015-03-22 21:42:54

使用以下命令尝试

代码语言:javascript
复制
Constructor<example1> ctor = examTesting.getConstructor(new Class[]{String.class});

这将返回带有一个String类型参数的构造函数。您的方法可能会返回多个值,因此会搜索具有多个参数的构造函数,但找不到,因此会抛出NoSuchMethodException。

有关getClasses()的更多信息:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClasses%28%29

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29195039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档