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().setContextClassLo ader(loader);
Class classB = loader.loadClass("B");
Constructor ctorB = classB.getConstructor(...);
Object objB = ctorB.newInstance(...);
+ списан JBossRMIClassLoader в идентичный ClientRMIClassLoader.
+ добавлена системная проперти java.rmi.server.RMIClassLoaderSpi=Client RMIClassLoader.
И заработало Ж)
Имеется 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().setContextClassLo
Class classB = loader.loadClass("B");
Constructor ctorB = classB.getConstructor(...);
Object objB = ctorB.newInstance(...);
+ списан JBossRMIClassLoader в идентичный ClientRMIClassLoader.
+ добавлена системная проперти java.rmi.server.RMIClassLoaderSpi=Client
И заработало Ж)
