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



我有以下类:

public class B {
}
public class A<B> {
}

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

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

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

例如,以下代码将输出不带泛型的class java.util.ArrayList

List<String> list = new ArrayList<String>();
System.out.println(list.getClass());
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>>

由于泛型类的所有实例都共享同一个类对象,因此类型参数对运行时并不重要,因此您可以简单地执行以下操作:

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

并将结果强制转换为所需的任何类型。

最新更新