2008-10-17 7 views
10

estoy viendo siguiente excepción cuando trato de usar proxy dinámico¿La interfaz no es visible desde ClassLoader cuando se usa un 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) 

Alguna idea de lo que tengo que hacer para resolverlo

Respuesta

5

Cuando sus DynamicProxy trata de hacer Class.forName(youInterfaceClass.getName()) la java.lang.Class instancia resultante es diferente de la uno que aprobó cuando creó el proxy. En otras palabras, tiene dos objetos de clase con el mismo nombre y el proxy no está seguro de cuál es el correcto (no importa si son los mismos).

Normalmente, esto ocurre cuando la interfaz que intentas utilizar está en una biblioteca cargada a través de dos cargadores de clases diferentes (es decir, 'común' y 'aplicación' de Tomcat).

Si esto no ayuda, publique más información en su aplicación, especialmente si está utilizando cualquier servidor de aplicaciones, Spring u OSGi.

9

Si se trata de una aplicación web, debe usar el cargador de clases de la aplicación web al crear un proxy dinámico. Así, por ejemplo, en lugar de:

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

intento:

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

Por ejemplo, la jerarquía de los cargadores de clases Tomcat (otros recipientes web tienen similar) es el siguiente:

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

Y es el cargador de clases webapp que contiene clases y recursos en el directorio/WEB-INF/classes de su aplicación web, más clases y recursos en archivos JAR bajo el directorio/WEB-INF/lib de su aplicación web ion.

Cuestiones relacionadas