Можно ли изменить этот код Java во время выполнения, чтобы вставить небольшой код - PullRequest
2 голосов
/ 16 декабря 2011

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

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

MyObjectType является базовым объектом в моем приложении, и я часто повторяю многие из них.У меня настроен log4j, так что я записываю информацию об экземпляре 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, инструментарий, какой-нибудь Java-агент?), насколько это будет сложно (может быть, это не стоит затраченных усилий).

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

Ответы [ 3 ]

1 голос
/ 17 декабря 2011

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

0 голосов
/ 16 декабря 2011

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

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

0 голосов
/ 16 декабря 2011

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

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

Только мое мнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...