Image

Imagehazai wrote in Imageru_java

remote interfacы и classloaderы

Здравствуйте!

Имеется remote interface A, и A.jar содержащий этот интерфейс, и еще bean Aimpl на jboss 4,2. Также имеется B.jar с классом Б, который при создании (в конструкторе) обращается к Aimpl, делая ему каст в A:

InitialContext ctx = new InitialContext();
A a = (A) ctx.lookup(Aname);

Работаеть.

Теперь убираем B.jar из класспаса и подгружаем его через URLClassLoader и создаем B рефлекшном:

...
ClassLoader loader = new URLClassLoader(new URL [] {new URL("http://sex4free\B.jar")})
Class classB = loader.loadClass("B");
Constructor ctorB = classB.getConstructor(...);
Object objB = ctorB.newInstance(...);
...

Тоже работаеть, А получаем нормально.

Теперь убираем A.jar:

...
ClassLoader loader = new URLClassLoader(new URL [] {new URL("http://sex4free\A.jar"), new URL("http://sex4free\B.jar")});
Class classB = loader.loadClass("B");
Constructor ctorB = classB.getConstructor(...);
Object objB = ctorB.newInstance(...);
...

Получаем ClassCastException: $Proxy0 cannot be cast to A - в ctorB.newInstance(...).

Нутром чую, что проблема в том, что Proxy0 создается системным класслоадером, а А - моим новым. Но не знаю, как исправить положение. Буду рад любой помощи Ж)

Upd:

Ларчик открылся следующим образом:

ClassLoader loader = new URLClassLoader(new URL [] {new URL("http://sex4free\A.jar"), new URL("http://sex4free\B.jar")});
Thread.currentThread().setContextClassLoader(loader);
Class classB = loader.loadClass("B");
Constructor ctorB = classB.getConstructor(...);
Object objB = ctorB.newInstance(...);

+ списан JBossRMIClassLoader в идентичный ClientRMIClassLoader.

+ добавлена системная проперти java.rmi.server.RMIClassLoaderSpi=ClientRMIClassLoader.

И заработало Ж)