从注释处理器中的注释对象获取 Class 个字段
Get Class fields from annotated Object in annotation processor
我正在开发我的第一个注释处理器。我正在尝试通过声明对象(这是方法的一个字段)上的注释来获取 class 的字段。
例如:
public class Person {
private String name;
private String surname;
}
...
public void myMethod(@MyAnnotation Person person) {
/*...*/
}
...
通过@MyAnnotation 我想获得'name' 和'surname' 字段。
这可能吗?我对方法的字段做了类似的事情:
...
for (Element element : roundEnvironment.getElementsAnnotatedWith(AnnotationOnMethod.class)) {
ExecutableElement method = (ExecutableElement) element;
List<? extends VariableElement> parameters = method.getParameters();
parameters.forEach(p -> {
/*code here for parameter*/
});
}
...
提前致谢,卢卡。
解决方法:
对于我的解决方案,我假设注释在方法上而不是在方法的参数上。我的问题的正确答案是 rjeeb 发布的答案。你可以在下面看到它。
Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(AnnotationOnMethod.class);
for (Element element : elements) {
ExecutableElement executableElement = (ExecutableElement) element;
List<? extends VariableElement> parameters = executableElement.getParameters();
for (VariableElement parameter : parameters) {
DeclaredType declaredType = (DeclaredType) parameter.asType();
TypeElement clazz = (TypeElement) declaredType.asElement();
clazz.getEnclosedElements().forEach(o -> {
if (o.getKind().isField()) {
log.info("Simple name of field: " + o.getSimpleName());
}
});
}
}
你的注解是 ElementType.PARAMETER
类型的,所以一旦你得到用它注解的元素,它就应该是 TypeElement
,因此你可以得到这种类型元素的字段
for (Element element : roundEnv.getElementsAnnotatedWith(AnnotationOnMethod.class)) {
TypeElement typeElement = elementUtils.getTypeElement(element.asType().toString());
Set<? extends Element> fields = typeElement.getEnclosedElements()
.stream()
.filter(o -> o.getKind().isField())
.collect(Collectors.toSet());
// do something with the fields
}
您可以从 AbstractProcessor
中获取助手 类
private Messager messager;
private Types typeUtils;
private Elements elementUtils;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
messager = processingEnv.getMessager();
typeUtils = processingEnv.getTypeUtils();
elementUtils = processingEnv.getElementUtils();
}
我正在开发我的第一个注释处理器。我正在尝试通过声明对象(这是方法的一个字段)上的注释来获取 class 的字段。 例如:
public class Person {
private String name;
private String surname;
}
...
public void myMethod(@MyAnnotation Person person) {
/*...*/
}
...
通过@MyAnnotation 我想获得'name' 和'surname' 字段。
这可能吗?我对方法的字段做了类似的事情:
...
for (Element element : roundEnvironment.getElementsAnnotatedWith(AnnotationOnMethod.class)) {
ExecutableElement method = (ExecutableElement) element;
List<? extends VariableElement> parameters = method.getParameters();
parameters.forEach(p -> {
/*code here for parameter*/
});
}
...
提前致谢,卢卡。
解决方法: 对于我的解决方案,我假设注释在方法上而不是在方法的参数上。我的问题的正确答案是 rjeeb 发布的答案。你可以在下面看到它。
Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(AnnotationOnMethod.class);
for (Element element : elements) {
ExecutableElement executableElement = (ExecutableElement) element;
List<? extends VariableElement> parameters = executableElement.getParameters();
for (VariableElement parameter : parameters) {
DeclaredType declaredType = (DeclaredType) parameter.asType();
TypeElement clazz = (TypeElement) declaredType.asElement();
clazz.getEnclosedElements().forEach(o -> {
if (o.getKind().isField()) {
log.info("Simple name of field: " + o.getSimpleName());
}
});
}
}
你的注解是 ElementType.PARAMETER
类型的,所以一旦你得到用它注解的元素,它就应该是 TypeElement
,因此你可以得到这种类型元素的字段
for (Element element : roundEnv.getElementsAnnotatedWith(AnnotationOnMethod.class)) {
TypeElement typeElement = elementUtils.getTypeElement(element.asType().toString());
Set<? extends Element> fields = typeElement.getEnclosedElements()
.stream()
.filter(o -> o.getKind().isField())
.collect(Collectors.toSet());
// do something with the fields
}
您可以从 AbstractProcessor
private Messager messager;
private Types typeUtils;
private Elements elementUtils;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
messager = processingEnv.getMessager();
typeUtils = processingEnv.getTypeUtils();
elementUtils = processingEnv.getElementUtils();
}