1

リフレクションライブラリを使用せずに、ランタイムコンパイル済みクラスを使用するためのライブラリまたは回避策が存在するかどうかを知りたいです(クラスを動的に生成し、.javaを記述してから、.classでコンパイルします)。

リフレクションを使用したロード私は常に次のように作業する必要があります。

//path where my newly generated classes are 
File file = new File("e:\\tmp");
// Convert File to a URL
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("eu.dataaccess.footballpool.TGoal");
// Create an instance of the class just loaded
Object o = cls.newInstance();
Method method2 = cls.getDeclaredMethod("getIMinute");
Object result2 = method2.invoke(o);

私の質問は、実行時に使用することがどういうわけか可能かどうかです

TGoal x = new TGoal();

x.getIMinute();

編集:私が望んでいたように行動することは不可能のようです。私は質問を次のように変更します:ロードされたパッケージのクラスがmethod.invokeなしで相互に通信できるように、実行時にパッケージ全体をロードすることは可能ですか?その間、パッケージのメインアクティベーションはメソッドinvoke()?

運が悪かったのですが、「エラー:シンボルが見つかりません」というエラーが発生しました。ランタイムにロードされたクラスが相互に通信できないようです。

4

3 に答える 3

1

リフレクションAPIを使用していない場合は、new演算子を使用してクラスをインスタンス化する必要があります。これには、コンパイル時にクラスファイルが必要です。したがって、それは不可能です。クラスTGoalがインターフェイスIGoalを実装している場合は、オブジェクトoをIGoalにキャストできます。これにより、リフレクションAPIを使用せずに、他のオブジェクトと同じようにオブジェクトを操作できます。

于 2012-07-02T10:47:04.950 に答える
1

できるよ

x.getIMinute();

インターフェイスを使用していますが、知る限り、リフレクションなしで新しいクラス インスタンスを作成することはできません。

代わりに、動的に作成されたオブジェクトのメソッドを呼び出すために、インターフェイスを宣言できます。

public interface MinuteGetter{
   public int getIMinute();
}

あなたの動的オブジェクトは、あなたができるよりも彼を実装する必要があります:

Class cls = cl.loadClass("eu.dataaccess.footballpool.TGoal");
// Create an instance of the class just loaded
MinuteGetter o = (MinuteGetter) cls.newInstance();
o.getIMinute();

コードにインターフェースを適用できない場合は、AnonymousClassLoader を試すことができます。それについては、この詳細な投稿を参照してください。Java 7 でのみ動作します。私は一度も使用したことがないことに注意してください。したがって、リフレクションよりも優れたパフォーマンスを提供するかどうかはわかりません。

于 2012-07-02T10:43:15.830 に答える
-1

実行時にコードを作成する必要がありますか? これを回避するのが最も簡単な方法です。

TGoal x = new TGoal()このプログラムでこれが発生する必要がない場合は、生成されたコードでメイン関数を作成し、2 番目の Java アプリケーションを開始します。

于 2012-07-02T10:42:31.623 に答える