我有一个包含以下内容的 IFile:
package com.example;
//@SimpleAnnotation(Blab.ckass)
//@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)
public class SimpleClassWithAnnotation {
}
如何向类(class)添加注释(注释的注释)?我尝试使用 this 线程中的解决方案,但来源没有改变。这是我使用的代码片段: final ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(this.cu);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(this.ifile);
final CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
final AST ast = astRoot.getAST();
astRoot.recordModifications();
final NormalAnnotation newNormalAnnotation = astRoot.getAST().newNormalAnnotation();
newNormalAnnotation.setTypeName(astRoot.getAST().newName("AnnotationTest"));
这是添加一个简单的注释 @AnnotationTest
的尝试。但是我需要这样的东西:@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)
提前致谢 ! 最佳答案
经过大量尝试,我找到了解决方案。问题就像 Unni Kris 提到的那样,我必须使用 ASTRewriter
来操作 AST 树。另一个问题是如何将更改保存回文件。我找到了一个解决方案,我不确定它是否 100% 正确,但至少它对我有用。
private void addAnnotations(final ICompilationUnit cu) throws MalformedTreeException, BadLocationException, CoreException {
// parse compilation unit
final ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(cu);
final CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
// create a ASTRewrite
final AST ast = astRoot.getAST();
final ASTRewrite rewriter = ASTRewrite.create(ast);
final ListRewrite listRewrite = rewriter.getListRewrite(astRoot, CompilationUnit.TYPES_PROPERTY);
final NormalAnnotation eventHandlerAnnotation = astRoot.getAST().newNormalAnnotation();
eventHandlerAnnotation.setTypeName(astRoot.getAST().newName("CustomAnnotation"));
eventHandlerAnnotation.values().add(createAnnotationMember(ast, "arg1", "Blup"));
eventHandlerAnnotation.values().add(createQualifiedAnnotationMember(ast, "arg2", "IsWorkbenchTest", "Blab"));
final SingleMemberAnnotation runWithFop = astRoot.getAST().newSingleMemberAnnotation();
runWithFop.setTypeName(astRoot.getAST().newName("SimpleAnnotation"));
final TypeLiteral newTypeLiteral = astRoot.getAST().newTypeLiteral();
newTypeLiteral.setType(astRoot.getAST().newSimpleType(astRoot.getAST().newSimpleName("Blop")));
runWithFop.setValue(newTypeLiteral);
listRewrite.insertAt(runWithFop, 0, null);
listRewrite.insertAt(eventHandlerAnnotation, 0, null);
final TextEdit edits = rewriter.rewriteAST();
// apply the text edits to the compilation unit
final Document document = new Document(cu.getSource());
edits.apply(document);
// this is the code for adding statements
cu.getBuffer().setContents(formatFileContent(document.get()));
cu.save(null, true);
}
protected MemberValuePair createQualifiedAnnotationMember(final AST ast, final String name, final String value, final String value2) {
final MemberValuePair mV = ast.newMemberValuePair();
mV.setName(ast.newSimpleName(name));
final TypeLiteral typeLiteral = ast.newTypeLiteral();
final QualifiedType newQualifiedName = ast.newQualifiedType(ast.newSimpleType(ast.newSimpleName(value)), ast.newSimpleName(value2));
typeLiteral.setType(newQualifiedName);
mV.setValue(typeLiteral);
return mV;
}
protected MemberValuePair createAnnotationMember(final AST ast, final String name, final String value) {
final MemberValuePair mV = ast.newMemberValuePair();
mV.setName(ast.newSimpleName(name));
final TypeLiteral typeLiteral = ast.newTypeLiteral();
typeLiteral.setType(ast.newSimpleType(ast.newSimpleName(value)));
mV.setValue(typeLiteral);
return mV;
}
我还发现了一个插件,它显示了 eclipse 中 java 文件的 AST 结构( ASTView )。这帮助我弄清楚如何创建注释结构。只需创建一个具有所需结构的 java 文件,然后查看 AST 结构的外观。这是示例:
关于java - 使用 JDT 将注释附加到类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12748308/