修改类型的签名
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
。
我正在尝试以编程方式更改类型的签名,准确地说,我想让 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
。