usar poner fondo colorear color codigo java android design-patterns legacy-code

colorear - poner color de fondo a un jlabel en java



¿Cómo cambiar el comportamiento del método a través de la reflexión? (2)

Tengo un método estático en algún código heredado, que es llamado por varios clientes. Obviamente no tengo opciones para anularlo o cambiar el comportamiento a través de la inyección de dependencia. No estoy autorizado a modificar la clase existente.

Lo que quiero hacer ahora es cambiar el comportamiento (ese método, con la misma firma y el mismo tipo de devolución) utilizando la reflexión.

Es posible ? Si no, ¿puede algún patrón de diseño rescatarme?

Gracias !

EDITAR: Hay algo de confusión sobre lo que puedo cambiar / modificar. No puedo cambiar ninguna clase / método existente, pero puedo agregar más clases al proyecto. Lo mejor que puedo hacer con las clases existentes es anotarlas. Todo esto se hace para evitar romper cualquier cosa en el código existente, lo que significa una ronda completa de pruebas para un gran proyecto.

EDIT 2: java.lang.Instrumentation no está disponible para Android, ¡o bien suena como un buen ajuste!


Suena como un requisito extraño ...

De todos modos, la reflexión no le permite cambiar el comportamiento del código, solo puede explorar el código actual, invocar métodos y factores, cambiar valores de campos, ese tipo de cosas.

Si realmente desea cambiar el comportamiento de un método, tendría que usar una biblioteca de manipulación de códigos de bytes como ASM. Pero esto no será muy fácil, probablemente no sea una buena idea ...

Patrones que te pueden ayudar:

  • Si la clase no es definitiva y puede modificar los clientes, extienda la clase existente y sobrecargue el método, con el comportamiento deseado. Edición: ¡eso solo funcionaría si el método no fuera estático!
  • Programación de aspectos: agregue interceptores al método usando AspectJ

De todos modos, lo más lógico sería encontrar una manera de modificar la clase existente, las soluciones alternativas harán que su código sea más complicado y difícil de mantener.

Buena suerte.


Supongo que podría echar un vistazo a la clase de Instrumentation que tiene un método redefineClasses(ClassDefintion classDefinition) .

La redefinición puede cambiar los cuerpos del método, el conjunto constante y los atributos. La redefinición no debe agregar, eliminar o renombrar campos o métodos, cambiar las firmas de los métodos o cambiar la herencia.

Espero que esto ayude.

Referencias: Javadoc