JAVA getConstructor 抛出 NoSuchMethodException
JAVA getConstructor throws NoSuchMethodException
我是新来的 JAVA
我正在努力学习 reflection。
我想获得特定的构造函数(选择示例形式 here)
来自我的 class :
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
我在这里错过了什么?
尝试使用
Constructor<example1> ctor = examTesting.getConstructor(new Class[]{String.class});
这将 return 具有一个字符串类型参数的构造函数。您的方法可能 return 多个值,因此搜索了具有多个参数的构造函数但未找到 -> 抛出 NoSuchMethodException。
有关 getClasses() 的更多信息:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClasses%28%29
工作示例:
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()
return 是什么意思?好问题!让我们去调试:
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。检查一下,你就会发现为什么会这样。
为了完整起见。超级原始问题(编辑前)包含一个构造函数 - 一个非参数构造函数:
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()
return 是一个空数组,但实际上有一个符合条件的构造函数 - 一个非参数构造函数!它没有任何参数,由 String.class.getClasses()
编辑的数组 return 也不包含任何内容。这意味着成功找到构造函数,但是当尝试使用 ctor.newInstance("test")
实例化它时失败,因为找到的构造函数 不 接受任何参数。
我是新来的 JAVA 我正在努力学习 reflection。 我想获得特定的构造函数(选择示例形式 here) 来自我的 class :
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
我在这里错过了什么?
尝试使用
Constructor<example1> ctor = examTesting.getConstructor(new Class[]{String.class});
这将 return 具有一个字符串类型参数的构造函数。您的方法可能 return 多个值,因此搜索了具有多个参数的构造函数但未找到 -> 抛出 NoSuchMethodException。
有关 getClasses() 的更多信息:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getClasses%28%29
工作示例:
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()
return 是什么意思?好问题!让我们去调试:
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。检查一下,你就会发现为什么会这样。
为了完整起见。超级原始问题(编辑前)包含一个构造函数 - 一个非参数构造函数:
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()
return 是一个空数组,但实际上有一个符合条件的构造函数 - 一个非参数构造函数!它没有任何参数,由 String.class.getClasses()
编辑的数组 return 也不包含任何内容。这意味着成功找到构造函数,但是当尝试使用 ctor.newInstance("test")
实例化它时失败,因为找到的构造函数 不 接受任何参数。