Я согласен с ответом Seanizer о том, что вам нужен инструмент, который может анализировать Java. Это необходимо, но не достаточно; то, что вы действительно хотите, - это инструмент, который может провести надежное изменение массы.
Для этого вам понадобится инструмент, который может анализировать Java, сопоставлять шаблоны с проанализированным кодом, устанавливать вызов замены и выплевывать ответ, не разрушая остальную часть исходного кода.
Наш инструментарий реинжиниринга программного обеспечения DMS может делать все это для различных языков, включая Java. Он анализирует complete Java-системы исходного кода, создает абстрактные синтаксические деревья (для всего набора кода).
DMS может применять ориентированные по шаблону преобразования источник-источник для достижения желаемого изменения.
Для достижения эффекта ОП он применяет следующее преобразование программы :
rule replace_legacy_log(s:STRING): expression -> expression
" log(\s) " -> " log( \s, \class\(\), \method\(\) ) "
Это правило гласит: найдите вызов log, который имеет единственный строковый аргумент, и замените его вызовом log с еще двумя аргументами, определяемыми вспомогательными функциями class и метод .
Эти функции определяют содержащее имя метода и содержащее имя класса для корня узла AST, где правило находит совпадение.
Правило написано в «исходной форме», но фактически совпадает с AST и заменяет найденные AST измененными AST.
Чтобы вернуть измененный исходный код, вы просите DMS просто распечатать (чтобы сделать хороший макет) или распечатать верность (если вы хотите, чтобы макет старого кода был сохранен). DMS сохраняет комментарии, числа и т. Д. \
Если в существующем приложении имеется более одного определения функции «log», вам необходимо добавить классификатор:
... if IsDesiredLog().
где IsDesiredLog использует таблицу символов DMS и информацию о наследовании, чтобы определить, относится ли конкретный журнал к определению интереса.