注释处理器:如何将verity方法返回类型为Map <foo,bar>

时间:2018-01-17 18:35:52

标签: java return-type annotation-processing

如何验证方法的返回类型是带有类型参数Foo和Bar的Map?

public Map<Foo, Bar> getValue();

public void verify(ExecutableElement method) {
     TypeMirror returnType = method.getReturnType();
     // how to verify return type is Map<Foo,Bar>

} 

Foo和Bar可以是原始类型,用户定义类型或java类型(在java。*和javax。*包中)。这个问题实际上是:如何检查TypeMirror是Map<Foo,Bar>

1 个答案:

答案 0 :(得分:0)

不确定是否有更简单的方法,但以下工作。

public void verify(ExecutableElement method) {

    DeclaredType declaredMethod = (DeclaredType) method;
    Elements elementUtils = processingEnv.getElementUtils();

    TypeMirror mapType = elementUtils.getTypeElement("java.util.Map").asType();
    TypeMirror typeArg1 = elementUtils.getTypeElement("path.to.Foo").asType();
    TypeMirror typeArg2 = elementUtils.getTypeElement("path.to.Bar").asType();

    boolean equalMainType = declaredMethod.asElement().asType().equals(mapType);
    Iterator<? extends TypeMirror> iterator = declaredMethod.getTypeArguments().iterator();
    boolean typeArgRes1 = iterator.next().equals(typeArg1);
    boolean typeArgRes2 = iterator.next().equals(typeArg2);

    if (equalMainType && typeArgRes1 && typeArgRes2) {
        // Type matches
    }
}