1

URLClassLoader (親として共通のクラスローダーを持つ) を使用して実装がロードされるラッパーを介して使用される、1 つの一般的な部分といくつかの「実装固有」のプロジェクトがあります。現在、@Foo によって注釈が付けられたジェネリック クラス A がありますが、これはかなり実装固有です。

@Foo
public class A { ... } 

A は実装固有のコードを介して最初にロードされるため、URLClassLoader で開始されますが、親でのロードを試みます。これは、汎用クラスであるため、クラスをロードできます (汎用コードでクラスをインスタンス化できる必要がありますが、注釈にアクセスする必要はありません)。

次に、実装は注釈 @Foo をチェックしますが、Java ランタイムが一般的なものではない A.class.getClassLoader() を介して注釈をロードしようとするため、見つかりません。

明らかに、Java ランタイムを変更することはできませんが、URLClassLoader にそれによってロードされるクラスを宣言させる方法はありますか?一般的な親によって)?

4

1 に答える 1

0

実際には不可能のようです (おそらく正当な理由により)。class.getClassLoader() は実際に defineClass() を呼び出したローダーを返し、findLoadedClass() はそれが定義したクラスを返します。したがって、クラスを子ローダーで定義して、ロードされたクラスを親で返すことはできません。

クラスAを子ローダーにロードし(親ローダーからアクセスできるようにしない)、この子ローダーをクラスをロードする必要がある場所に渡すことで状況を解決しましたが、リフレクションによってロードするため、かなり一般的です。とにかく、それは動作します。

于 2014-01-29T15:55:38.040 に答える