将枚举值从c#传递给Java构造函数

本文关键字:Java 构造函数 枚举 | 更新日期: 2023-09-27 17:51:12

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

Java enum:

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对象传递,但即使这样也会给出相同的异常。

谁有任何建议,我可能做错了什么?

将枚举值从c#传递给Java构造函数

不需要传递0(底层值),而需要传递(带框的)enum值。所以这应该可以工作:

/* 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);

我不是100%确定,但我认为问题是,在。net中,enum的默认底层类型是int,但在Java中,你有EventType定义为一个类。Java中的构造函数期望一个对象,但从。net中,您试图传递相当于int的值。