2010-05-26 9 views
6

Todo,Anulación de un método en objetos creados estáticamente

Debido a un fallo en una biblioteca que estoy usando, necesito reemplazar el método dispose() en todos los objetos que se extiende una cierta clase y que sea un NO- OP. Sé que si estoy haciendo nuevas instancias de las clases directamente, esto es fácil de hacer:

layerManager = new LayerManagerLayer(wwd) { 
    @Override 
    public void dispose() {} 
}; 

El problema es que muchas de las instancias de los objetos que se obtiene no se construyen directamente por el código cliente, pero en su lugar, se crean a través de llamadas al método de biblioteca estática.

// Here I want to override the dispose method, but I cannot. 
Layer l = ShapefileLoader.makeShapefileLayer(this.getClass().getResource("polylines10.shp")); 

¿Hay alguna manera de inyectar mi método dispose en ese objeto creado estáticamente, sin modificar el código fuente original?

+0

* "¿Hay alguna manera que [...] pueda sin modificar el código fuente original?" * - Lección n. ° 1 - evite usar bibliotecas donde al menos no tenga la opción de modificar el código fuente para arreglar el show - Errores inesperados. –

Respuesta

5

Si el cliente compila su propio código, puede usar AspectJ para inyectar el método Your around dispose(). Otras opciones son algunas herramientas de modificación de códigos de bytes como cglib. Mire esta lista: http://java-source.net/open-source/bytecode-libraries

1

Puede utilizar una biblioteca de manipulación de códigos de bytes como Javassist. Necesitas básicamente buscar el código de byte de tu clase LayerManagerLayer e inyectar el método de eliminación en él.

Cuestiones relacionadas