使用Class.forName实例化参数化类型

时间:2013-05-21 01:49:20

标签: java generics reflection

我有以下课程:

public class B {
}

public class A<B> {
}

如果我有两个字符串变量,如何使用A实例化类Class.forName

String classNameA = "A";
String classNameB = "B";

3 个答案:

答案 0 :(得分:6)

由于type erasure,在运行时不会有任何泛型类。

例如,以下代码段将输出class java.util.ArrayList而没有泛型:

List<String> list = new ArrayList<String>();
System.out.println(list.getClass());

答案 1 :(得分:3)

Class<B> bClass = (Class<B>) Class.forName(classNameB);
B b = bClass.newInstance();
Class<A<B>> aClass = (Class<A<B>>) Class.forName(classNameA);
A<B> a = aClass.newInstance();

在运行时期间,类型A的类型参数不存在,因此您可以将aClass强制转换为Class<A<B>>

答案 2 :(得分:0)

由于泛型类的所有实例共享同一个类对象,因此type参数对运行时无关紧要,因此您只需执行以下操作:

Class.forName("A").newInstance();

并将结果转换为您需要的任何类型。