¿Cómo cambiar el comportamiento del método mediante la reflexión?

Tengo aa 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 se me permite modificar la clase existente.

Lo que quiero hacer ahora es cambiar el comportamiento (ese método – con la misma firma y tipo de retorno) mediante la reflexión.

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

Gracias !

EDIT: Existe cierta confusión en 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 nada 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, sólo puede explorar el código actual, invocar métodos y constructores, cambiar los valores de los campos, ese tipo de cosas.

Si realmente quieres cambiar el comportamiento de un método tendrías que usar una biblioteca de manipulación de bytecode como ASM. Pero esto no será muy fácil, probablemente no es una buena idea …

Patrones que pueden ayudarle:

  • Si la clase no es definitiva y puede modificar los clientes, extienda la clase existente y sobrecargue el método con el comportamiento deseado. Edit: que sólo funcionaría si el método no era estático!
  • Aspecto de programación: añadir interceptores al método utilizando AspectJ

De todos modos, lo más lógico es encontrar una manera de modificar la clase existente, work-arounds sólo hará que su código sea más complicado y más difícil de mantener.

Buena suerte.

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

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

Espero que esto ayude.

Referencias: Javadoc

  • Android: Actividad individual, vistas múltiples
  • Android: sobreescribir onPause y onResume - forma correcta
  • Separar las preocupaciones de la actividad y GoogleApiClient
  • ¿Cuál es la estructura / patrón de android / java para organizar las llamadas de servicio web http en el proyecto?
  • Qué patrones de diseño debo aprender antes de iniciar Android Development
  • ¿La variable estática es realmente segura para intercambiar datos entre actividades?
  • ¿La implementación vacía de métodos abstractos es un buen enfoque?
  • Android: Cómo implementar "control distribuido"
  • Patrón de diseño para un servicio como la arquitectura
  • ¿Alternativa al patrón observable?
  • Un patrón de diseño para evitar múltiples ifs
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.