修改类型的签名

Modifying the signature of a type

我正在尝试以编程方式更改类型的签名,准确地说,我想让 class 实现一个接口,或者换句话说,将 implements SomeInterface 添加到它的签名中。

我得到一个类型如下的对象:

IType ejbType = jproject.findType(ejbClass);

然后我希望 IType 有一个像 setSuperInterfaceNames(String[]) 这样的方法,但只有一个方法 getSuperInterfaceNames().

有没有可能用jdt来满足我的要求?

您可以使用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 文件)的所有更改,然后再将其写回,看起来像这样。

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