Переопределение метода в статически созданных объектах - PullRequest
6 голосов
/ 26 мая 2010

All

Из-за ошибки в библиотеке, которую я использую, мне нужно переопределить метод dispose () для всех объектов, расширяющих определенный класс, и сделать его NO-OP. Я знаю, что если я создаю новые экземпляры классов напрямую, это легко сделать:

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

Проблема в том, что многие экземпляры объектов, которые я получаю, не создаются непосредственно моим клиентским кодом, а вместо этого создаются посредством вызовов методов статической библиотеки.

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

Есть ли способ, которым я могу внедрить свой метод dispose в этот статически созданный объект без изменения исходного исходного кода?

Ответы [ 2 ]

5 голосов
/ 26 мая 2010

Если клиент компилирует свой собственный код, вы можете использовать AspectJ, чтобы внедрить ваш метод dispose (). Другие опции - это некоторые инструменты для модификации байт-кода, такие как cglib. Посмотрите на этот список: http://java -source.net / с открытым исходным кодом / байткодом-библиотеки

1 голос
/ 26 мая 2010

Вы можете использовать библиотеку манипулирования байтовым кодом, например Javassist . Вам нужно в основном получить байт-код вашего класса LayerManagerLayer и внедрить в него метод dispose.

...