我需要使用IKVM从C#运行JAR文件。 JAR包含一个类,其构造函数将枚举作为其参数之一。我面临的问题是,当我尝试使用IKVM在C#中创建此类的实例时,会抛出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对象传递,但即使这样也会产生相同的异常。
有没有人对我可能做错了什么有任何建议?
答案 0 :(得分: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);
答案 1 :(得分:0)
我不是百分百肯定但我相信问题是在.NET中,enum
的默认底层类型是int
但是在Java中你将EventType
定义为一个类。 Java中的构造函数需要一个对象,但是从.NET开始,您试图传递等效的int
。