如何检查注释处理器中的方法参数类型?

时间:2015-05-18 12:43:00

标签: java reflection annotation-processing

使用纯反射这很容易,但注释处理器世界似乎有所不同。如何从TypeMirror返回的getParameterTypes()String.class

在我的注释处理器中,我想检查当前访问的方法是否具有完全相同的形式:

public boolean someName(String input)

我可以检查原始返回类型,但String参数会产生问题:

private void processAnnotation(Element method, Messager msg) {
    final MyAnnotation ann = method.getAnnotation(MyAnnotation.class);
    if (method.getKind() != ElementKind.METHOD) {
      error("annotation only for methods", method);
    }
    Set<Modifier> modifiers = method.getModifiers();
    if(!modifiers.contains(Modifier.PUBLIC)) {
      error("annotated Element must be public", method);
    }
    if(modifiers.contains(Modifier.STATIC)) {
      error("annotated Element must not be static", method);
    }
    ExecutableType emeth = (ExecutableType)method.asType();
    if(!emeth.getReturnType().getKind().equals(TypeKind.BOOLEAN)) {
      error("annotated Element must have return type boolean", method);
    }
    if(emeth.getParameterTypes().size() != 1) {
      error("annotated Element must have exactly one parameter", method);
    } else {
      TypeMirror param0 = emeth.getParameterTypes().get(0);
      // TODO: check if param.get(0) is String
    }
}

2 个答案:

答案 0 :(得分:4)

我们可以通过Elements.getTypeElement通过其规范名称检索处理类型。

Types    types = processingEnv.getTypeUtils();
Elements elems = processingEnv.getElementUtils();

TypeMirror param0 = m.getParameterTypes.get(0);
TypeMirror string = elems.getTypeElement("java.lang.String").asType();

boolean isSame = types.isSameType(param0, string);

没有办法获得一个&#34;类&#34;因此,因为注释处理在部分编译上运行,我们无法加载正在编译的类。

答案 1 :(得分:1)

更简单的替代方案是:

从方法

中检索参数
ExecutableElement myMethod;
List<VariableElement> myParameters = myMethod.getParameters();

然后检查每个参数的类型(例如字符串或基元类型)

"java.lang.String".equals(myParameter.asType().toString())
myParameter.asType().getKind().isPrimitive()