有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中使用反射获取具有泛型参数和返回类型方法的类的实例?

public enum E{
E1,E2,E3
}

public class Service{
...
}

public interface A<RET>{
  RET get();
}

public interface AI<RET,CONF> extends A<RET>{
   void conf(CONF ...args);
}

public class AC implements AI<Service,E>{
  public void conf(E ...args){
   ....
 }
public Service get(){
  return new Service();
}
}

现在,当我尝试使用反射创建类“AC”的实例时,我遇到了错误:

public Class MyReflectionAPI{
  public Object getInstance(){
       Class <? extends AI> aClass = (Class <? extends AI>) Class.forName("AC");
       Constructor<? extends AI> aCon = aClass.getConstructor(null);
       AI ai = aCon.newInstance((Object[]) null);

        Class<?> typeArg = Class.forName("[L"+"E"+";");
        Method valueOfTypeArg = typeArg.getMethod("valueOf", String.class);
        Object obj[] = new Object[]{valueOfTypeArg.invoke(typeArg,"E1")};
        ai.conf(obj);
    }

}

给我一个错误: 线程“main”java中出现异常。lang.ClassCastException:[Ljava.lang.Object;不能强制转换为[E

是否有任何方法可以获取AC类实例的对象,并向其传递泛型对象


共 (1) 个答案

  1. # 1 楼答案

    Java数组知道它们的组件类型。因此,您需要创建反射阵列。试试下面的方法

    Class<?> typeE = Class.forName("E");
    Object obj = Array.newInstance(typeE,1);
    Array.set(obj,0,valueOfTypeArg.invoke(typeE,"E1"));
    ai.conf((Object[])obj);    // good reason to hate varargs