我有一个带注释的类:
public class CacheMessageHolder<TestMessage> implements MessageHolder<TestMessage> {
protected @MessageHolderType TestMessage message;
@Override
@SendProtoAll (proto ="protoMessageClass", matchType=MatchType.PARTIAL)
public void setMessage( TestMessage msg) {
this.message = msg;
}
}
在我的注释处理器中,我想要获取传递到 setMessage 方法的对象上的 getter 方法列表,然后该信息将用于代码生成。
我扩展了 ElementScanner6 并设法获得一个似乎保存参数的 VariableElement,但我不知道从这里去哪里。
所以在这个例子中我想在编译时获取TestMessage类中的所有方法。
任何想法
最佳答案
注解处理相当麻烦,而且很快就会迷失。我认为你应该获取该参数元素对应的类型,然后获取该类型对应的元素,然后获取其成员并过滤它们。尝试使用以下代码,让我知道它是否有效:
VariableElement parameterElement;
ProcessingEnvironment processingEnv;
TypeMirror parameterType = parameterElement.asType();
Types typeUtils = processingEnv.getTypeUtils();
TypeElement typeElement = (TypeElement) typeUtils.asElement(parameterType);
Elements elementUtils = processingEnv.getElementUtils()
List<? extends Element> elementMembers = elementUtils.getAllMembers(typeElement);
List<ExecutableElement> elementMethods = ElementFilter.methodsIn(elementMembers);
for(ExecutableElement methodElement : elementMethods) {
if (methodElement.getParameters().size()==0 && methodElement.getSimpleName().toString().startsWith("get")) {
// do something
}
}
我认为它应该可以工作,但不能 100% 确定它是一个 getter,因为你无法检查方法体内做了什么。我假设“getter”是指以“get”开头且没有参数的方法。
这能回答你的问题吗?
关于java - 我可以在编译时从注释处理器中的 TypeVariable 或 VariableElement 获取底层类上的方法列表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926632/