Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反射:如何找到接受对象列表的构造函数?_Java_Reflection - Fatal编程技术网

Java 反射:如何找到接受对象列表的构造函数?

Java 反射:如何找到接受对象列表的构造函数?,java,reflection,Java,Reflection,我有一个类,它接受构造函数中的列表 public class MyClass { private List<Structure> structures; public MyClass(List<Structure> structures) { this.structures = structures; } } 公共类MyClass{ 私人名单结构; 公共MyClass(列表结构){ 这个结构=结构; }

我有一个类,它接受构造函数中的列表

public class MyClass {

       private List<Structure> structures;

       public MyClass(List<Structure> structures) {
          this.structures = structures;
       }
}
公共类MyClass{
私人名单结构;
公共MyClass(列表结构){
这个结构=结构;
}
}
我需要通过反射来实例化。如何定义对class.getConstructor()的调用来查找这个

关于

这应该是可行的:

Constructor<MyClass> constructor = MyClass.class.getConstructor(List.class);

对于Java 1.4.x或更低版本

,只需传入
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 });
    }
}
Type[] types = ctor.getGenericParameterTypes();
System.out.println(types[0]); // Prints java.util.List<Structure>
调用
getConstructor
时,不需要指定类型参数,因为不能通过仅使用不同类型参数的参数来重载构造函数。这些参数类型将具有相同的类型擦除。例如,如果尝试添加具有此签名的另一个构造函数:

public MyClass(List<String> structures)
公共MyClass(列表结构)
您将得到如下错误:

java:7:name clash:
MyClass(java.util.List)
MyClass(java.util.List)
具有相同的擦除


那容易吗?我假设我必须用对结构的引用来限定列表-类似于list.class,而且没有任何结果。@user497087-已经认为,这是您的问题-泛型类型在编译过程中被删除,构造函数签名只包括类名(
java.util.list
),而不包括泛型类型(这就是为什么如果只使用相同的类型和不同的泛型类型,重载不起作用)
public MyClass(List<String> structures)