Pregunta

He intentado utilizar el código que Sun publicó en su Página de uso de proxy , e intenté usar DebugProxy para imprimir qué método se invoca. La cuestión es que el objeto para el que estoy creando un proxy debe tener un argumento. Si intento crear el proxy con un argumento para el constructor, recibo el siguiente error:

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to myPackage.myClass

Creé el proxy de esta manera:


MyClass mc = (MyClass) DebugProxy.newInstance(new MyClass(props));

¿Cómo puedo crear una instancia de proxy y aún llamar al constructor correcto?

¿Fue útil?

Solución

El proxy generado por JDK no es del mismo tipo de clase que el objeto que está representando. En su lugar, implementa las mismas interfaces del objeto de destino. Debe transmitir a uno de esos tipos de interfaz.

Si miras el ejemplo en la página a la que vinculaste, está transmitiendo a Foo, no a FooImpl.

Otros consejos

¿Su clase implementa alguna interfaz que está intentando probar? Las clases de proxy solo implementan métodos desde una interfaz. Si desea imprimir antes / después de cada método de una clase (ya sea para métricas o depuración), sugeriría utilizar la programación orientada a aspectos (AOP). Nunca lo he hecho yo mismo, pero escucho que AspectJ es lo que quieres.

public interface SomeInterface {
    public void someMethod();
}

public MyClass implements SomeInterface {
...
}

// DebugProxy doesn't return your class, but a class which implements all of the interfaces
// you class implements
SomeInterface mc = (SomeInterface ) DebugProxy.newInstance(new MyClass(props));

Cuando desee crear un proxy, debe proporcionar una interfaz para implementar. No es una clase concreta.

Las interfaces no describen constructores, por lo que lo que desea hacer no es factible de inmediato.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top