2011-12-16 2 views
2

У меня довольно большая база кода. Во многих местах у меня есть кусок кода, как это:можно изменить этот код Java во время выполнения, чтобы вставить небольшой код

for (MyObjectType myobj : myList) { 
    //...do something with myobj 
} 

MyObjectType является основным объектом в моем приложении, и я перебрать многие из них очень часто. У меня есть некоторые log настроить так, что я вхожу информацию о экземпляре MyObjectType Я имею дело с:

for (MyObjectType myobj : myList) { 
    MDC.put("myobj", myobj.identify()); 
    ... 
    logger.error("this message contains info about myobj") 
} 

Это действительно полезно. К сожалению, есть тонны для такого вида, когда я забыл использовать mdc.put(). Так я думал ... был бы каким-то образом, чтобы инструмент код так, чтобы:

  1. я обнаруживаю есть для цикла по коллекции MyObjectType
  2. вставить это в качестве первой команды внутри цикла: MDC.put("myobj", myobj.identify());

Если есть способ (используя aop, instrumentation, java agent?), Насколько это сложно (возможно, это не стоит усилий).

Я никогда не пользовался какой-либо java-байт-кодовой библиотекой, просто пружинят легко.

+0

Очень жаль, что Coccinelle не поддерживает Java (пока) ... Иначе это был бы идеальный инструмент для этой работы! – fge

+0

Вместо использования магических трюков старайтесь не дублировать свой код, потому что именно это и вызвало вашу проблему. –

ответ

0

Вы можете изменить/добавить классы во время выполнения, используя javassist.
Это практически черная магия.

Я также использовал janino с большим успехом.

0

Я считаю, что вам нужно будет сделать это во время загрузки класса. Я не знаю, как это сделать сам. Но наша компания использует приложение от поставщика, который таким образом использует наш код приложения.

Непонятно, что инструмент должен был быть замечен программистом (ИМХО). Мне было интересно, почему бы не использовать рефакторинг через IDE, например eclipse и т. Д., Где вы могли бы найти все экземпляры чего-то, а затем добавить код? Оба потребуют тестирования, но, вероятно, будет сложнее отлаживать проблемы для решения проблем, если вы ошиблись в своей аппаратуре.

Просто мое мнение.

1

Если метод итерации довольно сложный, и вы так много используете его, возможно, вам следует переместить его в новый класс утилиты специально для работы с этими функциями? Таким образом, вам нужно что-то написать один раз, и все вызовы нового статического метода будут повторно использовать один и тот же код.