簡體   English   中英

JavaParser AnnotationExpr獲取參數

[英]JavaParser AnnotationExpr get parameters

我有一個AnnotationExpr ,如何獲取參數及其注釋值(例如@UnityBridge(fullClassName = "test") - 如何獲取fullClassName參數的值)。 JavaParser是否支持此功能?

我必須接受另一位訪客嗎? 在這種情況下哪一個?

遲到的回答,我遇到了同樣的問題,只是將AnnotationExpr轉換為以下之一:

MarkerAnnotationExpr (無參數),

SingleMemberAnnotationExpr (對於單個參數),

NormalAnnotationExpr (用於多個參數)。

您可能需要instanceof來確定當前注釋類型。

我更喜歡沒有instanceof的這種方法,而是按類型搜索子節點,盡管你仍然需要區分單個參數而沒有鍵來找到參數“value”:

private static final String VALUE = "value";

public static Expression getValueParameter(AnnotationExpr annotationExpr){
    Expression expression = getParamater(annotationExpr, VALUE);
    if(expression == null){
        List<Expression> children = annotationExpr.getChildNodesByType(Expression.class);
        if(!children.isEmpty()){
            expression = children.get(0);
        }
    }
    return expression;
}

public static Expression getParamater(AnnotationExpr annotationExpr, String parameterName){
    List<MemberValuePair>children = annotationExpr.getChildNodesByType(MemberValuePair.class);
    for(MemberValuePair memberValuePair : children){
        if(parameterName.equals(memberValuePair.getNameAsString())){
            return memberValuePair.getValue();
        }
    }
    return null;
}

最簡單的解決方案是:

import com.github.javaparser.StaticJavaParser
import com.github.javaparser.ast.CompilationUnit
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration
import com.github.javaparser.ast.expr.AnnotationExpr
import com.github.javaparser.ast.NodeList
import com.github.javaparser.ast.expr.MemberValuePair

// Annotation
public @interface AnnotationName {
  String argumentName();
}

// Class with this annotation
@AnnotationName(argumentName = "yourValue")
public class ClassWithAnnotationName {}

// Parse class with annotation
CompilationUnit compilationUnit = StaticJavaParser.parse(sourceFile);
Optional<ClassOrInterfaceDeclaration> classInterfaceForParse = compilationUnit.getInterfaceByName("ClassWithAnnotationName");

// Get annotation by name
final AnnotationExpr messageQueueKeyAnnotation =
        classInterfaceForParse.get().getAnnotationByName("AnnotationName").get();

// Get all parameters. It doesn't matter how many.
final NodeList<MemberValuePair> annotationParameters = messageQueueKeyAnnotation.toNormalAnnotationExpr().get().pairs;

// Read annotation parameter from the list of all parameters
final String argumentName = annotationParameters.get(0).value;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM