3

次の内容のIFileがあります。

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

}

クラスに注釈(コメント付きのもの)を追加するにはどうすればよいですか?このスレッドのソリューションを使用しようとしましたが、ソースは変更されません。これが私が使用したコードスニペットです:

    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)

前もって感謝します !

4

3 に答える 3

6

何度も試した後、私は解決策にたどり着きました。問題は、Unni Krisが述べたようにASTRewriter、ASTツリーを操作するために使用する必要があるということです。もう1つの問題は、変更をファイルに保存する方法でした。私は解決策を見つけました。それが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のスクリーンショット

于 2012-10-11T09:02:12.710 に答える
1

行われた変更はASTにのみ適用され、Javaソースコードファイルには記録されません。

以下のリンクを確認してください。これにより、ASTの変更をファイルに書き込む方法についての洞察が得られます。

http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html

アップデート:

次のように注釈値を追加できます。

MemberValuePair mV = astRoot.getAST().newMemberValuePair();
mV.setName(astRoot.getAST().newSimpleName("name"));
TypeLiteral typeLiteral = astRoot.getAST().newTypeLiteral();
typeLiteral.setType(astRoot.getAST().newSimpleType(astRoot.getAST().newSimpleName("Blup")));
mV.setValue(typeLiteral);
newNormalAnnotation.values().add(mV);

次に、クラスの修飾子のリストにNormalAnnotationを追加できます。

于 2012-10-09T06:24:06.787 に答える
1

以下を使用したソリューションで:

final ListRewrite listRewrite = rewriter.getListRewrite(astRoot, CompilationUnit.TYPES_PROPERTY);

アノテーションとクラスの間に1行のスペースがあります。そこで、Modifierとして注釈を追加しようとしましたが、うまく機能しているようです。以下はそれを行う方法の例です:

final MarkerAnnotation javaTaskInfoA = ast.newMarkerAnnotation();
javaTaskInfoA.setTypeName(ast.newSimpleName(JavaTaskInfo.class.getSimpleName()));
acu.accept(new ASTVisitor() { public boolean visit(TypeDeclaration node) {
    rewriter.getListRewrite(node, node.getModifiersProperty()).insertAt(javaTaskInfoA, 0, null);
    return false;
}});

マレク

于 2014-04-11T00:46:50.203 に答える