Eclipse JDT从注解IMemberValuePair

时间:2018-08-14 12:30:27

标签: eclipse-jdt

我需要从这样的注释(使用字符串常量)中检索值:

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

但是我得到一种K_UNKNOWN,文档说“该值是一个表达式,需要进一步分析以确定其类型”。然后我的问题是如何执行此分析?在这种情况下,我什至可以接受获取纯原始文本值。

2 个答案:

答案 0 :(得分:2)

另一个答案看起来基本上没问题,但是让我提出一种避免使用内部类<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/item_gridview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingStart="0dp" android:paddingEnd="10dp" android:paddingTop="10dp" android:paddingBottom="10dp"/> </LinearLayout> 及其方法org.eclipse.jdt.internal.core.Annotation的方法:

findNode()

从现在开始,应该安全使用DOM API。

答案 1 :(得分: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;
}