gpt4 book ai didi

JAVA getConstructor 抛出 NoSuchMethodException

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:12 28 4
gpt4 key购买 nike

我是 JAVA 新手我正在努力学习 reflection .我想获得特定的构造函数(选择示例形式 here )来 self 的类(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

我在这里错过了什么?

最佳答案

工作示例:

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); // prints 0

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

为了完整起见。 super 原始问题(编辑前)包含一个构造函数 - 一个非参数构造函数:

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") 实例化它时,它失败了,因为找到的构造函数接受任何参数.

关于JAVA getConstructor 抛出 NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29195039/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com