工作示例:
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
方法实际上并不接受数组作为参数。它的定义如下:
public Constructor<T> getConstructor(Class<?>... parameterTypes) {
这意味着它接受可变数量的参数,这些参数应该像我做的那样传递。传递一个数组也是可能的,但并不必要。
你最初所做的相当于:
Constructor<Test> constructor = Test.class.getConstructor(String.class.getClasses())
constructor.newInstance("Hello")
但是,String.class.getClasses()
返回什么呢?好问题!让我们去调试:
Class<?>[] classes = String.class.getClasses()
System.out.println(classes.length)
有一个有关getClasses()
的文档:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getClasses。查看它,你就会明白为什么是这样的。
为了完整起见,在编辑之前的超级原始问题中还包含一个非参数构造函数:
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")
实例化它时,它失败了,因为找到的构造函数不接受任何参数。
main()
方法中添加throws Exception
,并尝试实例化该类(ctor.newInstance("foo")
)。这样问题就符合网站的标准了,我会给它点赞(事实上,现在它不能编译/运行)。 - tzimaIllegalArgumentException
异常,而不是你在标题和帖子中所声称的NoSuchMethodException
异常(因此对于潜在的寻找NoSuchMethodException
解决方案的读者来说仍然不是非常有用)。 - PshemoString.class.getClasses()
返回一个空数组,并且实际上存在非参数构造函数,因此找到了它。问题发生在尝试实例化它时(IllegalArgumentException
)。我认为现在这对其他人来说应该是可以OK和有帮助的了。 - tzima