0

我需要使用 IKVM 从 C# 运行 JAR 文件。JAR 包含一个类,其构造函数将枚举作为其参数之一。我面临的问题是,当我尝试使用 IKVM 在 C# 中创建此类的实例时,会引发 IllegalArgumentException。

Java枚举:

public class EventType{
  public static final int General;
  public static final int Other;
  public static int wrap(int v);
}

Java 类:

public class A{
   private EventType eType;
   public A(EventType e){
     eType = e;
   }
}

C#用法:

/* loader is the URLClassLoader for the JAR files */
java.lang.Class eArg = java.lang.Class.forName("A", true, loader);

/* Instantiate with the underlying value of EventType.General */
object obj = eArg.getConstructor(EventType).newInstance(0); 

eArg 由 forName(..) 方法正确加载。但是,eArg 类的实例化会引发 IllegalArgumentException。除了 exception.TargetSite.CustomAttributes 指定该方法未实现外,异常中没有任何消息。我也尝试将构造函数参数作为 java.lang.Field 对象传递,但即使这样也给出了相同的异常。

有人对我可能做错的事情有任何建议吗?

4

2 回答 2

1

您需要传递(装箱的)枚举值,而不是传递 0(基础值)。所以这应该工作:

/* loader is the URLClassLoader for the JAR files */
java.lang.Class eArg = java.lang.Class.forName("A", true, loader);

/* Instantiate with the underlying value of EventType.General */
object obj = eArg.getConstructor(EventType).newInstance(EventType.General);
于 2013-01-11T10:57:36.420 回答
0

我不是 100% 确定,但我相信问题在于,在 .NET 中,默认的底层类型enum是,int但在 Java 中,您已将EventType其定义为一个类。Java 中的构造函数需要一个对象,但在 .NET 中,您正在尝试传递等效于int.

于 2013-01-10T20:09:12.573 回答