java - 使用 JDT 将注释附加到类

标签 java eclipse-plugin annotations abstract-syntax-tree eclipse-jdt

我有一个包含以下内容的 IFile:

package com.example;
//@SimpleAnnotation(Blab.ckass)
//@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)
public class SimpleClassWithAnnotation {

}

如何向类中添加注释(注释)?我尝试使用 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 结构的外观。这是示例:

Eclipse Screenshot

关于java - 使用 JDT 将注释附加到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12748308/

相关文章:

java - Joda - "hh:mm AM"在 "AM"处格式错误

java - 如何关闭扫描仪?

java - 如何将 Eclipse 编辑器标记为脏,同时不忽略编辑器中所做的其他更改

Eclipse:缺少 Eclipse 应用程序启动配置

java - 使用注释注入(inject)替换通过 XML 进行的 Spring bean 注入(inject)

java - AdoptOpenJDK8 找不到 Openjfx 包,即使它是依赖项

eclipse - XText:使用自定义终端定义

枚举值 : passing the annotation instance on to user code 上的 Java 注释

java - 了解 Java 中的注解处理

java - Maven 不会编译 Java 注解?