[英]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.