java - 如何使用 Java Mirror API 确定该类是抽象类?

标签 java apt annotation-processing mirroring

我正在编写一个注释处理器,并希望根据javax.lang.model.element.VariableElement确定相应的字段类型是抽象类还是具体类。或者它是一个接口(interface)。 怎么做?

示例

@SomeAnnotation
public class SomeClass {
    private Map<String,String> interfaceField;
    private AbstractMap<String,String> abstractField;
    private HashMap<String, String> concreteField;
}

因此,每个字段都有 VariableElement 。并且想知道interfaceField的类型是接口(interface),abstractField的类型是抽象的,而concreteField的类型是具体类。

如果我调用.getModifiers(),我就会得到私有(private)。如果我调用 .getKind(),我会得到“FIELD”。所以,这没有什么帮助

最佳答案

Element#getModifiers()会告诉你class是否是abstract:

    if (element.getModifiers().contains(Modifier.ABSTRACT)) { ... }

Element#getKind()会告诉你它是否是一个接口(interface):

    if (element.getKind() == ElementKind.INTERFACE) { ... }
<小时/>

要从类的所有字段获取信息,您应该使用 TypeVisitor:

TypeVisitor<Void, VariableElement> type_visitor = new TV();
for (VariableElement field : ElementFilter.fieldsIn(cls.getEnclosedElements())) {
    field.asType().accept(type_visitor, field);
}

其中type_visitor是你自己定制的TypeVisitor,它通过各种hoops,能够得到一个Element你可以调用上面的getKind()getModifiers() 方法:

class TV extends SimpleTypeVisitor8<Void, VariableElement> {

    @Override
    public Void visitDeclared(DeclaredType type, VariableElement field) {
        System.out.println(field.getSimpleName());
        System.out.println("  type = " + type.toString());
        System.out.println("  modifiers = " + field.getModifiers());
        Element e = type.asElement();
        System.out.println("    kind = " + e.getKind());
        System.out.println("    modifiers = " + e.getModifiers());
        return null;
    }
}

给定以下类(class):

public class MyClass {
    private Properties properties;
    private List<String> strings;
    // ...
}

我得到以下输出:

properties
  type = java.util.Properties
  modifiers = [private]
    kind = CLASS
    modifiers = [public]
strings
  type = java.util.List<java.lang.String>
  modifiers = [private]
    kind = INTERFACE
    modifiers = [public, abstract]

关于java - 如何使用 Java Mirror API 确定该类是抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44208672/

相关文章:

wso2 - Ballerina 注释处理未按预期工作

java - play框架异常?

java - 为什么 Eclipse 或 IntelliJ 中的控制台总是为空?

ubuntu-18.04 - 在 Ubuntu 上进行 apt 更新时出现 GPG 错误 (EXPKEYSIG)

ubuntu - 防止 apt 覆盖手动安装的包

java - Gradle:以编程方式指定compileJava任务的编译器选项

java - 以实数为根生成随机二次方程

java - eclipse java 控制台中的输出中断

java - 如何在 APT 中访问 @XmlElement 值?

java - 注释处理器