0

IKVMを使用してC#からJARファイルを実行する必要があります。JARには、コンストラクターがパラメーターの1つとして列挙型をとるクラスが含まれています。私が直面している問題は、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 からは .NET に相当するものを渡そうとしていますint

于 2013-01-10T20:09:12.573 に答える