2

我有一个带注释的类:

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 方法的 Object 的 getter 方法列表,然后此信息将用于代码生成。

我扩展了 ElementScanner6 并设法获得了一个似乎包含参数的 VariableElement,但我不知道从这里去哪里。

所以在这个例子中,我想在编译时获取 TestMessage 类中的所有方法。

有任何想法吗

4

1 回答 1

11

注解处理比较麻烦,很快就迷路了。。我觉得应该先获取这个参数元素对应的类型,然后获取这个类型对应的元素,再获取它的成员,过滤掉。尝试使用以下代码,并让我知道它是否有效:

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”是指以“get”开头且没有参数的方法。

这是否回答你的问题 ?

于 2011-08-04T10:48:44.340 回答