Так, вот является часть использования кода CodeModel, который генерирует код Java:
JCodeModel cm = new JCodeModel();
JDefinedClass dc = cm._class("foo.Bar");
JMethod m = dc.method(0, int.class, "foo");
m.body()._return(JExpr.lit(5));
File f = new File("C:/target/classes");
f.mkdirs();
cm.build(f);
Этот код генерирует .java файл:
package foo;
public class Bar {
int foo() {
return 5;
}
}
Однако я НЕ хочу, чтобы CodeModel создал новый файл Java для меня. Я уже действительно имею .java файл и хотел бы добавить несколько строк кода к методу в нем. Так, я хотел бы, чтобы API изменил файл Java непосредственно/, создают измененную копию его. Существует ли путь к выполнению этого?
Вам нужна система преобразования программ . Это инструмент, который анализирует ваш исходный файл и может применять преобразования для его изменения, а также регенерировать исходный код с изменениями.
Система преобразования источника в источник принимает правила вида:
lhs -> rhs if cond
где lhs и rhs являются исходными шаблонами для допустимых фрагментов языка, а cond проверяет безопасность применения правила. (Рассмотрим «? X /? X -> 1, если? X ~ = 0»; вам нужно условие, чтобы убедиться, что деление допустимо).
Одним из таких инструментов является наш DMS Software Reengineering Toolkit . DMS имеет полные C, C ++, C #, Java, COBOL, Python, PHP и анализаторы интерфейса ECMAScript (как и многие менее известные языки) и может применять такие правила напрямую. DMS также обеспечивает построение таблиц символов и управление ими, а также анализ потока данных, так как они часто полезны при определении cond для сложных правил. При желании вы также можете вернуться к «стандартному» процедурному интерфейсу для посещения узлов дерева и изменения AST.
Вам действительно понадобится полный синтаксический анализ кода, который вы хотите изменить, чтобы убедиться, что вы вставляете код в правильное расположение. Я бы подумал, что лучше всего будет использовать существующий инструмент синтаксического анализа, который позволяет переписывать код, а не пытаться сделать что-то вручную.
Eclipse IDE делает что-то подобное для поддержки рефакторинга кода. Эта статья может быть полезной.