有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

apt如何使用Java镜像API确定该类是抽象的?

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

示例

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

因此,每个字段都有VariableElement。想知道接口字段的类型是一个接口,抽象字段的类型是抽象的,具体字段的类型是具体的类

如果我调用.getModifiers(),我会得到private。如果我调用.getKind(),我得到了“FIELD”。所以,这没用


共 (1) 个答案

  1. # 1 楼答案

    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,通过各种环,它能够获得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;
        }
    }
    

    鉴于以下类别:

    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]