我是JAVA的新手
而且我正在尝试学习reflection
我想获取特定的构造函数(选择示例形式here)
从我类:

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");
    }
}

尝试实例化NoSuchMethodException时收到ctor
我在这里想念什么?

最佳答案

工作示例:

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

09-29 22:51