0

これはほとんどのJavaプログラマーにとって明らかなように思えます。答えはわかっていると「思います」が、私の問題は、カスタムクラスローダーを使用する必要があることです。カスタムクラスローダーを使用したいのですが、含まれているクラスと同じように、コード内のクラスを引き続き使用できます。

例:

// returns my class loader -- set earlier on the thread.
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class loadedVersion = Class.forName("org.example.MyClass"); // works
// loadedVersion's class loader is also equal to cl

// generates "java.lang.NoClassDefFoundError" at runtime on the following line
org.example.MyClass m = new org.example.MyClass();

カスタムクラスローダーを使用してクラスをロードし、エディターでクラスを「プレーンに」使用できるようにするには、どうすればよいでしょうか。

編集:改訂されたタイトルは誤解を招く可能性があります-クラスは問題なくロードされます。私の元の投稿に示されているように。私の理解では、問題は、現在、通常の宣言ステートメントでクラスを使用できないことです(java。*クラスを使用するのと同じようにエディターで)。

更新、これが私がやろうとしていることをよりよく説明することを願っています。

// set the thread's class loader
ClassLoader cloader = new MyClassLoader(); // internal mess to load bytecode omitted
Thread.currentThread().setContextClassLoader(cloader);

// This works:
Method m = cloader.loadClass("my.SuperClass").getMethod("doStaticMagic", new Class<?>[] {});
m.invoke(null, null);

// This does not work:
my.SuperClass.doStaticMagic(); // NoClassDefFoundError

これが「問題」です。エディターでクラスを「わかりやすく」(正しい単語が本当にわかりません)使用したいと思います。個々のメソッドをロードする必要はありません-それはクラスローダーの目的ではありませんか?

4

3 に答える 3

0

以下のコードのように、クラスパスにインターフェイスのみがあり、クラスローダーなどで実装をロードする方がよいでしょう。

Class loadedVersion = Class.forName("org.example.MyClass"); 

IMyClass m = (IMyClass)loadedVersion.newInstance();

ここで、IMyClass は によって実装されるインターフェイスorg.example.MyClassです。このようにして、クラスの実装をクライアント コードから完全に切り離すことができます。

編集

NoClassDefFoundError静的変数の初期化中または静的ブロック初期化子の実行中に例外が発生した場合にも発生します。クラスを確認してください。おそらく、そのような例外がスローされます。

于 2012-10-22T17:56:05.043 に答える
0

これが私の元の質問に対する私の解決策(答え)です。私はまだこれを理想とは考えていませんが、これは機能します。

最初にすべてのカスタム サードパーティ jar をロードし、次にアプリケーション クラスをロードして呼び出す「ブートストラップ」アプリケーションを作成しました。このようにして、サードパーティの jar のオートコンプリートとソース ヒントを取得します。

これが誰かに役立つことを願っています。または、さらにコメントを求めています。

于 2012-12-11T20:41:32.740 に答える
0

newInstance() メソッドを使いたいと思います。「Class loadedVersion」があるので、それを使ってメソッドを呼び出すことができます。

于 2012-10-22T17:58:46.703 に答える