Создать JCodeModel из существующих исходных файлов
Я хочу создать исходный код Java с фрагментами кода, которые, возможно, синтаксически неверны. Это возможно с помощью метода com.sun.codemodel.JBlock#directStatement().
Моя проблема в том, что я хочу изменить существующие (синтаксически действительные) исходные файлы, и я не могу найти способ создать JCodeModel из файла (или String, или Stream и т. Д.).
Есть ли способ сделать это с JCodeModel?
(Вместо этого я мог бы использовать инфраструктуру Eclipse JDT/AST, но, по- видимому, она не предлагает возможность прямого добавления фрагментов кода...)
3 ответа
Вы можете использовать JavaParser для эффективного разбора вашего кода и tben с результатами разбора, вы можете делать манипуляции с JCodemodel.
ИМХО подход может быть таким.
Попытайтесь увидеть, чего вы пытаетесь достичь с
существующие (синтаксически действительные) исходные файлы
Затем выясните, можете ли вы сделать это, не изменяя их путем наследования или включения классов в сгенерированные классы. Это обеспечит четкое разделение сгенерированного и уже созданного кода.
Если это невозможно, попробуйте использовать шаблоны проектирования, такие как посетитель, в существующих (синтаксически допустимых) классах и внедрить в них созданный экземпляр класса кода, чтобы выполнить работу.
В худшем случае - последний вариант будет действительно модифицировать существующие классы.
Я бы порекомендовал вам не использовать манипулирование кодом JAVA (это довольно сложно манипулировать кодом JAVA из программы), но манипулирование байт-кодом JAVA. Три часто используемых манипулятора байт-кода:
Если вам действительно нужно манипулировать с исходным кодом, вы можете проверить Eclipse JDT и класс ASTRewrite. Ниже приведен пример того, как создать метод и
final ASTRewrite rewrite= new ASTRewrite(root);
root.accept(new ASTVisitor() {
public boolean visit(Assignment assignment) {
// check if affected
AST ast= assignment.getAST();
MethodInvocation setter= ast.newMethodInvocation();
setter.setName(ast.newSimpleName(setterName));
setter.arguments().add(
rewrite.createMoveTarget(assignment.getRightHandSide()));
rewrite.replace(assignment, setter);
}
});
Учебники:
- http://sahits.ch/blog/?p=228
- Добавление комментариев: http://www.programcreek.com/2012/06/add-comments-by-using-eclipse-jdt-astrewrite/
- Парсинг и переписывание: http://www.eclipsecon.org/2010/sessions/?page=sessions&id=1339 (для манипулирования кодом см. Стр. 44 - 46)