如何检查注释处理器中的方法参数类型?
How to check a methods parameter type in an Annotation Processor?
如果使用纯反射,这会很容易,但注释处理器世界似乎有所不同。我如何从 TypeMirror
return 由 getParameterTypes()
编辑到 String.class
?
在我的 Annotation Processor 中,我想检查当前访问的方法是否具有以下形式:
public boolean someName(String input)
我可以检查原始 return 类型,但是 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
}
}
我们可以通过 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);
没有办法得到这样的 "class",因为注释处理在部分编译上运行,我们无法加载正在编译的 类。
一个更简单的选择是:
从方法中检索参数
ExecutableElement myMethod;
List<VariableElement> myParameters = myMethod.getParameters();
然后检查每个参数的类型(例如字符串或原始类型)
"java.lang.String".equals(myParameter.asType().toString())
myParameter.asType().getKind().isPrimitive()
如果使用纯反射,这会很容易,但注释处理器世界似乎有所不同。我如何从 TypeMirror
return 由 getParameterTypes()
编辑到 String.class
?
在我的 Annotation Processor 中,我想检查当前访问的方法是否具有以下形式:
public boolean someName(String input)
我可以检查原始 return 类型,但是 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
}
}
我们可以通过 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);
没有办法得到这样的 "class",因为注释处理在部分编译上运行,我们无法加载正在编译的 类。
一个更简单的选择是:
从方法中检索参数
ExecutableElement myMethod;
List<VariableElement> myParameters = myMethod.getParameters();
然后检查每个参数的类型(例如字符串或原始类型)
"java.lang.String".equals(myParameter.asType().toString())
myParameter.asType().getKind().isPrimitive()