2008-10-17 8 views
10

widzę następujący wyjątek podczas próby korzystania z dynamicznego proxyInterfejs nie jest widoczny z ClassLoader podczas korzystania z serwera proxy?

com.intellij.rt.execution.application.AppMain DynamicProxy.DynamicProxy 
Exception in thread "main" java.lang.IllegalArgumentException: interface Interfaces.IPerson is not visible from class loader 
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353) 
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581) 
    at DynamicProxy.Creator.getProxy(Creator.java:18) 
    at DynamicProxy.DynamicProxy.main(DynamicProxy.java:54) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

Każdy pomysł, co trzeba zrobić, aby rozwiązać go

Odpowiedz

5

Gdy DynamicProxy próbuje zrobić Class.forName(youInterfaceClass.getName()) wynikowej instancji java.lang.Class różni się od jedną, którą zdałeś, gdy utworzyłeś proxy. Innymi słowy masz dwa obiekty klasy o tej samej nazwie, a proxy nie jest pewien, który z nich jest właściwy (nie ma znaczenia, czy są takie same).

Zwykle dzieje się tak, gdy interfejs, z którym próbujesz dokonać proxy, znajduje się w bibliotece załadowanej przez dwa różne programy ładujące klasy (tj. "Wspólny" i "aplikacja" Tomcat).

Jeśli to nie pomoże, opublikuj więcej informacji na temat aplikacji - zwłaszcza jeśli używasz dowolnego serwera aplikacji, Spring lub OSGi.

9

Jeśli jest to aplikacja internetowa, podczas tworzenia dynamicznego proxy powinieneś używać programu ładującego klasy aplikacji WWW. Tak więc, na przykład zamiast:

Proxy.newProxyInstance(
    ClassLoader.getSystemClassLoader(), 
    new Class <?>[] {MyInterface.class}, 
    new InvocationHandler() { 
    // (...) 
}); 

Spróbuj:

Proxy.newProxyInstance(
    this.getClass().getClassLoader(), // here is the trick 
    new Class <?>[] {MyInterface.class}, 
    new InvocationHandler() { 
    // (...) 
}); 

Na przykład hierarchia ładowarki klasy tomcat (pozostałe pojemniki internetowe mają podobny) jest następujący:

 Bootstrap 
      | 
     System 
      | 
     Common 
    / \ 
    Webapp1 Webapp2 ... 

i to to program ładujący klasy, który zawiera klasy i zasoby w katalogu/WEB-INF/classes twojej aplikacji internetowej oraz klasy i zasoby w plikach JAR w katalogu/WEB-INF/lib twojego aplikatora internetowego jon.