Java 从类文件实例化泛型参数化类型

Java 从类文件实例化泛型参数化类型,java,reflection,Java,Reflection,因此,客户机将以以下方式创建一个类: public class Tester implements Test<Type1, Type2, Type3> { @override public method1(...) ... } 公共类测试仪实现测试{ @凌驾 公共方法1(…) ... } 然后客户端将把.class文件(即Tester.class)传递给我们 然后,我们希望实例化客户机的类,并根据泛型使用的类型运行它们的method1。到目前为止,我有以下

因此,客户机将以以下方式创建一个类:

public class Tester implements Test<Type1, Type2, Type3> {
    @override
    public method1(...)
    ...
}
公共类测试仪实现测试{
@凌驾
公共方法1(…)
...
}
然后客户端将把.class文件(即Tester.class)传递给我们

然后,我们希望实例化客户机的类,并根据泛型使用的类型运行它们的method1。到目前为止,我有以下代码,但我认为我没有走上正确的道路:

    //tempClass = <ClassName>.class
    Type[] genericTypes;
    Type[] genericInterfaces = tempClass.getGenericInterfaces();
    if(genericInterfaces[0] instanceof ParameterizedType){
        genericTypes = ((ParameterizedType)genericInterfaces[0])
                        .getActualTypeArguments();
    }
    Class<Tester<genericTypes[0], genericTypes[1], genericTypes[2]>> classTest
        = ( Class<Tester<genericTypes[0], genericTypes[1], genericTypes[2]>>) tempClass
    Constuctor<...> = ... //get the constructor
    //Create the new instance by calling .newInstance()
//tempClass=.class
类型[]泛型;
类型[]genericInterfaces=tempClass.getGenericInterfaces();
if(参数化类型的GenericInterface[0]实例){
genericTypes=((ParameterizedType)GenericInterface[0])
.getActualTypeArguments();
}
班级考试
=(类)临时类
构造函数=//获取构造函数
//通过调用.newInstance()创建新实例

但是eclipse在Class>行中给了我很多错误,所以我认为这不是正确的路径。我做错了什么?

这里有几个问题

首先,这两个
Classname.class
都是固有的静态构造,甚至被称为classliteral。因此,在运行时不能提供类型名,这就是为什么Eclipse抱怨您这样做的尝试。要获取以类名作为字符串的
Class
对象,可以使用Class.forName:

  • 为了避免警告,由于类型erasuer,这类强制转换实际上是未选中的,因为在运行时无法确保其正确性。在您知道强制转换是有效的,并且Java类型系统太笨,无法验证您的声明的地方使用
    @SuppressWarnings


  • 不管怎样,不要选这个班。相反,强制转换
    newInstance
    调用的结果。现在,关于运行正确的方法。。。现在您已经有了所需的全部信息,分为两部分:调用方法的对象和实现接口的类型参数。

    您将知道类的名称,即
    Tester
    ?是的,我们知道类的名称。抱歉,我们不知道(我们只知道“Tester.class”)。不过,我们应该知道接口
    Class<?> tempClass = Class.forName("Tester");
    
    if (B.isAssignableFrom(A)) {
        // ...
    }