2015-02-18 2 views
0

Я пытаюсь программно изменить подпись типа, точнее хочу, чтобы класс реализовал интерфейс или добавил implements SomeInterface к его подписи другими словами.Изменение подписи типа

я получаю объект для данного типа следующим образом:

IType ejbType = jproject.findType(ejbClass); 

Тогда я ожидал бы IType иметь метод, как setSuperInterfaceNames(String[]) но есть только метод getSuperInterfaceNames().

Есть ли возможность удовлетворить мое требование с помощью jdt?

ответ

1

Вы можете использовать Eclipse AST для изменения кода. Грубо говоря, шаги:

1) Разбираем исходный файл [CompilationUnit unit = parseAst(ejbType.getCompilationUnit())]

public static CompilationUnit parseAst(ICompilationUnit unit, SubMonitor progress) { 
    ASTParser parser = ASTParser.newParser(AST.JLS8); 
    parser.setSource(unit); 
    parser.setResolveBindings(true); 
    return (CompilationUnit)parser.createAST(progress); 
} 

2) Найти тип, который вы хотите изменить в вашем CompilationUnit, используя шаблон посетителя:

unit.accept(new ASTVisitor() { 
    @Override 
    public boolean visit(TypeDeclaration node) { 
     IType type = (IType) node.resolveBinding().getTypeDeclaration().getJavaElement(); 
     if (ejbType.equals(type)) { 
      modifyTypeDeclaration(node); 
     } 
     return false; 
    } 
}); 

3) Внедрение modifyTypeDeclaration(TypeDeclaration node).

Я обычно использую ASTRewrite, чтобы собрать все изменения в блок компиляции (* .java-файл), bevor, записывающий его обратно, что выглядит примерно так.

ICompilationUnit cu = ejbType.getCompilationUnit(); 
cu.becomeWorkingCopy(...); 
CompilationUnit unit = parseAst(ejbType.getCompilationUnit()) 
final ASTRewrite rewrite = ASTRewrite.create(unit.getAST()); 
collectChangesToUnit(unit, rewrite); 
cu.applyTextEdit(rewrite.rewriteAST(), ...); 
cu.commitWorkingCopy(false, ...); 

Если ваш случай действительно просто вы можете также изменить TypeDeclaration непосредственно.

Смежные вопросы