java - 我可以在编译时从注释处理器中的 TypeVariable 或 VariableElement 获取底层类上的方法列表吗

标签 java annotations annotation-processing

我有一个带注释的类:

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/

相关文章:

Java方法扩展而不是覆盖

java - 实体映射中的重复列应使用插入 ="false"更新 ="false"进行映射

ios - 将我的 Pin 更改为自定义图像在我的 MKMapView 中不起作用

javax.annotation.processing.AbstractProcessor : compiling generated code

java - 如果代码不能按时完成会发生什么

java - 如何通过 API 调用在 Android Studio 中实现 autocompletetextview?

java - 使用带有字符串分割器的扫描仪

java - 为什么 IllegalArgumentException (JDK 1.4.2) 不能用可抛出的原因构造?

java - 如何使用 JavaPoet 生成调用父类(super class)构造函数的构造函数

android - 数据绑定(bind)注释处理器 kapt 警告