【问题标题】:How to get Instance of a Class using reflection in java having generics parameter and return type method?java - 如何在具有泛型参数和返回类型方法的java中使用反射获取类的实例?
【发布时间】:2020-09-12 18:45:48
【问题描述】:
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 类实例的对象?

【问题讨论】:

  • 嘿!不确定"[L"+"E"+";" 应该是什么类。你能解释一下吗?
  • 这里“[L”和“;”添加到读取类型“E”的数组类型类,这里 E 是 Enum,正如您在具有值 enum E {E1,E2,E3} 的问题中看到的
  • 您的代码甚至无法编译;众所周知,你写的是Class 而不是class。然后,您在数组上调用valueOf 方法的尝试已经失败,因此您永远不会到达代码会产生ClassCastException 的地步。您应该提供一个minimal reproducible example,而不是从未见过编译器的伪代码。
  • @Holger 感谢您的纠正,我已更新。实际上我不能发布实际的代码,所以需要创建它的演示版本。对此我深表歉意。

标签: java class methods reflection


【解决方案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

【讨论】:

  • 没有理由讨厌可变参数。只需简化您的代码:Class&lt;? extends Enum&gt; typeE = Class.forName( "E").asSubclass(Enum.class); Object[] arr = (Object[])Array.newInstance(typeE, 1); arr[0] = Enum.valueOf(typeE, "E1"); ai.conf(arr);
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多