反思:如何找到一个带有对象列表的构造函数?

use*_*087 5 java reflection

我有一个类在构造函数中获取List;

public class MyClass {

       private List<Structure> structures;

       public MyClass(List<Structure> structures) {
          this.structures = structures;
       }
}
Run Code Online (Sandbox Code Playgroud)

我需要通过反射实例化.如何定义对class.getConstructor()的调用来查找它?

问候

And*_*s_D 8

这应该工作:

Constructor<MyClass> constructor = MyClass.class.getConstructor(List.class);
Run Code Online (Sandbox Code Playgroud)

要么

Constructor constructor = MyClass.class.getConstructor(new Class[]{List.class});
Run Code Online (Sandbox Code Playgroud)

适用于Java 1.4.x或更低版本


Jon*_*eet 5

你可以通过传递找到它List.class.例如:

import java.util.*;
import java.lang.reflect.*;

public class Test {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;
        Constructor<?> ctor = clazz.getConstructor(List.class);

        ctor.newInstance(new Object[] { null });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要验证泛型参数类型,可以使用getGenericParameterTypes并检查Type[]它返回的内容.例如:

Type[] types = ctor.getGenericParameterTypes();
System.out.println(types[0]); // Prints java.util.List<Structure>
Run Code Online (Sandbox Code Playgroud)

调用时不需要指定类型参数,getConstructor因为不能通过使用仅具有不同类型参数的参数来重载构造函数.那些参数类型将具有相同类型的擦除.例如,如果您尝试使用此签名添加另一个构造函数:

public MyClass(List<String> structures)
Run Code Online (Sandbox Code Playgroud)

你会得到这样的错误:

MyClass.java:7:名称冲突:MyClass(java.util.List<java.lang.String>)并且 MyClass(java.util.List<Structure>)具有相同的擦除