1

動的にロードされたクラスから Java クラスを動的にロードする際に問題が発生しています。

私のクラスはImageJプラグインで、他のモジュールを動的にロードしますclassloader。プラグインNoClassDefFoundErrorと同じパッケージにあるものを参照するモジュールをロードするときがあります。ImageJ

私が正確に行うことは次のとおりです。

  1. ImageJ ロード プラグイン (A)
  2. (A) システム クラス ローダーを取得する
  3. (A) jar URL をクラスローダーに追加する
  4. (A) を使用して、目的のクラス (B) を jar にロードしようとします。Class.forName

NoClassDefFoundError現在のクラスローダーで見つからなかった A のクラスを B が指していることが原因で、クラス B をロードできません。

最初にプラグインをロードするために使用したのと同じクラスローダーをImageJ使用して、モジュールをロードし、以前にImageJ. 再コンパイルせずにこれを行いたいImageJです。

ImageJコードを更新したり変更したりすることなく、この問題を解決する方法はありますか?

疑似クラスの例

package a;
class A extends PlugInFrame {}


package a;
class C extends MyOwnPlugIn {}

package b;
import a;
class B extends C {}
4

2 に答える 2

2

最も簡単な方法は、クラスを動的にロードすることを控えることですが、それを直接使用することです。

その方法がない場合、最善の方法は、.jar ファイルがすべて ImageJ の plugins/ フォルダーにあることを確認し (または、フィジーを使用している場合は、非プラグインの .jar ファイルが jars/ にあることを確認し)、ImageJ のプラグイン クラスローダーを使用することです: IJ.getClassLoader ().loadClass("ブラブ");

ステップ 3 は大したことではないことに注意してください。システム クラス ローダーのクラスパスに要素を追加しないでください。

また、すべての ImageJ の専門家は、StackOverflow に投稿するのではなく、imagej@list.nih.gov 経由で連絡を取ることができます。

于 2013-01-26T17:56:41.427 に答える
1

これらのクラスを動的にロードする必要があるかどうかはわかりませんが、A のクラスローダーを取得するには

ClassLoader classLoader = A.getClass().getClassLoader()

次に、それを使用して、 B には引数なしのコンストラクターが必要であることを念頭に置いて B をインスタンス化します。

B を組み込んだプラグイン jar ファイルをビルドしてみませんか? 私はたくさんのプラグインを作成しましたが、通常は依存関係を追加してから、必要なすべての依存関係を組み込んだプラグイン jar ファイルを作成します。

于 2013-01-25T12:00:24.130 に答える