toptal test questions online interview java dynamic proxy

questions - test java online



¿La interfaz no es visible desde ClassLoader cuando se usa un proxy? (2)

Veo la siguiente excepción cuando trato de usar el proxy dinámico

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


Cuando su DynamicProxy intenta hacer Class.forName(youInterfaceClass.getName()) la instancia de java.lang.Class resultante es diferente de la 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).

Por lo general, esto sucede 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.


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. Entonces, por ejemplo, en lugar de:

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

tratar:

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

Por ejemplo, la jerarquía de cargadores de clases tomcat (otros contenedores web tienen similares) es la 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.