1

私は次のことを試みています:
1)指定されたファイルの場所からインターフェイスと実装クラスをロードします
2)インターフェイスに一致するリフレクションを使用してProxyオブジェクトを作成し、すべての呼び出しを実装クラスに転送します

これは、後でJUnitを使用したテスト目的で使用されます。

問題:
しかし、プロキシオブジェクトを作成しようとすると問題が発生するようです。例外が発生します:

java.lang.IllegalArgumentException: interface Testing.Testable is not visible from class loader
...at Core.ProxyFactory.createProxy(ProxyFactory.java:26)

問題の行は次のとおりです。

Object obj = Proxy.newProxyInstance(implementationClass.getClassLoader(), new Class[]{interfaceClass}, forwarder);

クラスの読み込みは正しいですか?
URLClassLoaderを使用して必要なクラスをロードしています。このスニペットは次のとおりです。

URL url = new File(path).toURI().toURL();
URL[] urlList = {url};
// Create loader and load
ClassLoader classLoader = new URLClassLoader(urlList);
Class loadedClass = classLoader.loadClass (classname);
return loadedClass;

しかし、これは正しいですか?このスニペットはクラスファイルごとに繰り返されるため、新しいクラスローダーが作成されるたびに私は信じています。これが私の問題を引き起こしている可能性がありますか?どうすればこれを解決できますか?

あなたが与えることができるどんな助けにも前もって感謝します

4

1 に答える 1

3

解決済み...
クラスを間違った方法でロードしていたという私の懸念は正しかった。クラスは互いに依存しているため (たとえば、あるクラスが別のクラスを使用するなど)、同じクラスローダーに属している必要があります。

この問題は、URLClassLoader の使用を次のものに置き換えることで解決できます。

ClassLoader classLoader = new URLClassLoader(urlList);
Class[] classes = new Class[classNames.length];
for (int i = 0; i<classNames.length; i++) {
  classes[i] = classLoader.loadClass(classNames[i]);
}

これにより、同じクラスローダーを使用して複数のクラスをロードできるようになり、問題が解決したようです!

于 2011-04-15T12:04:10.173 に答える