Создать 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);
}
});

Учебники:

Другие вопросы по тегам