Eclipse JDT从注释IMemberValuePair解析未知类型

问题描述 投票:0回答:2

我需要从注释中检索值,例如使用字符串常量的注释:

@Component(property = Constants.SERVICE_RANKING + ":Integer=10")
public class NyServiceImpl implements MyService {

但是我得到了一种K_UNKNOWN,并且文档说“价值是一种表达,需要进一步分析才能确定其类型”。那么我的问题是如何进行这种分析?在这种情况下,我甚至可以设法接受获取普通源文本值。

eclipse-jdt
2个回答
2
投票

另一个答案看起来基本上没问题,但是让我建议一种方法来避免使用内部类org.eclipse.jdt.internal.core.Annotation及其方法findNode()

ISourceRange range = annotation.getSourceRange();
ASTNode annNode = org.eclipse.jdt.core.dom.NodeFinder.perform(cu, range);

从这里开始,您应该是安全的,使用DOM API。


0
投票

谷歌搜索不同我找到了解决表达方式。如果有的话仍然对其他建议开放。对于那些可能感兴趣的人,这里有一段代码:

    if (valueKind == IMemberValuePair.K_UNKNOWN) {
    Annotation ann = (Annotation)annotation;
    CompilationUnit cu = getAST(ann.getCompilationUnit());
    ASTNode annNode = ann.findNode(cu);
    NormalAnnotation na = (NormalAnnotation)annNode;
    List<?> naValues = na.values();
    Optional<?> optMvp = naValues.stream()
            .filter(val-> ((MemberValuePair)val).getName().getIdentifier().equals(PROPERTY))
            .findAny();

    if (optMvp.isPresent()) {
        MemberValuePair pair = (MemberValuePair)optMvp.get();

        if (pair.getValue() instanceof ArrayInitializer) {
            ArrayInitializer ai = (ArrayInitializer)pair.getValue();
            for (Object exprObj : ai.expressions()) {
                Expression expr = (Expression)exprObj;
                String propValue = (String)expr.resolveConstantExpressionValue();
                if (propValue.startsWith(Constants.SERVICE_RANKING)) {
                    return true;
                }
            }
        }
        else {
            Expression expr = pair.getValue();
            String propValue = (String)expr.resolveConstantExpressionValue();
            if (propValue.startsWith(Constants.SERVICE_RANKING)) {
                return true;
            }
        }
    }                   
    //report error
}

private CompilationUnit getAST(ICompilationUnit compUnit) {
    final ASTParser parser = ASTParser.newParser(AST.JLS8); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(compUnit);
    parser.setResolveBindings(true); // we need bindings later on
    CompilationUnit unit = (CompilationUnit)parser.createAST(null);
    return unit;
}
© www.soinside.com 2019 - 2024. All rights reserved.