¿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.
- Agregando métodos a la clase Exist en android
- Implementación de MVP de Android
- ¿Cómo implementar un singleton configurable?
- Menú contextual similar a la nueva aplicación Play Music (v5.0.0)
- ¿Qué patrones de diseño se utilizan en Android?
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!
- onCreateView () no se llama inmediatamente después de FragmentTransaction.commit ()
- Android - index para ListView?
- Android: forma correcta de saltar entre fragmentos
- ¿Cuáles son los patrones de diseño utilizados en android?
- ¿Es preferible usar Activity.onAttachFragment o Fragment.onAttach para comunicarse entre una Actividad y un fragmento anidado?
- Compartir datos entre actividades y servicios
- Aplicación de diseño con más código de confusión?
- Cómo dejar actualizar la interfaz de usuario de Asynctask de diferentes maneras
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