2008-10-17 2 views
10

I Ausnahme sehe folgende wenn ich dynamische ProxySchnittstelle ist von ClassLoader nicht sichtbar, wenn ein Proxy verwendet wird?

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) 

Jede Idee, was ich tun müssen, verwenden versuchen

Antwort

5

Wenn Ihr DynamicProxy versucht Class.forName(youInterfaceClass.getName()) die resultierende java.lang.Class Instanz zu tun lösen von der unterscheidet eine, die Sie beim Erstellen des Proxys übergeben haben. Mit anderen Worten haben Sie zwei Klassenobjekte mit dem gleichen Namen und der Proxy ist nicht sicher, welcher der richtige ist (egal ob sie gleich sind).

Normalerweise geschieht dies, wenn die Schnittstelle, die Sie versuchen, Proxy ist in einer Bibliothek, die durch zwei verschiedene Klassenlader (d. H. Tomcat 'Common' und 'Anwendung') geladen wird.

Wenn dies nicht hilft, posten Sie weitere Informationen zu Ihrer Anwendung - insbesondere, wenn Sie einen Anwendungsserver, Spring oder OSGi verwenden.

9

Wenn es sich um eine Webanwendung handelt, sollten Sie beim Erstellen des dynamischen Proxys den Webanwendung-Classloader verwenden. So zum Beispiel statt:

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

Versuch:

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

Zum Beispiel Hierarchie von tomcat Klassenlader (andere Webcontainern ähnlich haben) folgt:

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

Und es ist der webapp classloader, der Klassen und Ressourcen im Verzeichnis/WEB-INF/classes Ihrer Webanwendung sowie Klassen und Ressourcen in JAR-Dateien im Verzeichnis/WEB-INF/lib Ihres Web-Applikats enthält Ion.

Verwandte Themen