views:

82

answers:

2

All,

Due to a bug in a library I'm using, I need to override the dispose() method on all objects extending a certain class and make it a NO-OP. I know that if I'm making new instances of the classes directly, this is easy to do:

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

The problem is that a lot of the object instances I get are not directly constructed by my client code, but instead are created via static library method calls.

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

Is there a way I can inject my dispose method into that statically created object without modifying the original sourcecode?

+4  A: 

If client compiles his own code, You can use AspectJ to inject Your around dispose() method. Other options are some bytecode modification tools like cglib. Look at this list: http://java-source.net/open-source/bytecode-libraries

Bartek Jablonski
+1  A: 

You can use a byte code manipulation library like Javassist. You need to basically fetch the byte code of your LayerManagerLayer class and inject dispose method to it.

Snehal