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

如何使用Java镜像API确定该类是抽象的?,java,apt,annotation-processing,mirroring,Java,Apt,Annotation Processing,Mirroring,我正在编写一个注释处理器,希望根据javax.lang.model.element.VariableElement确定相应的字段类型是抽象类还是具体类。或者它是一个接口。 怎么做 例子 @SomeAnnotation 公共类{ 专用地图接口字段; 私有抽象域; 私有HashMap字段; } 因此,我为每个字段设置了variablelement。想知道interfaceField的类型是一个接口,abstractField的类型是抽象的,concreteField的类型是具体的类 如果我调用.g

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

例子
@SomeAnnotation
公共类{
专用地图接口字段;
私有抽象域;
私有HashMap字段;
}
因此,我为每个字段设置了
variablelement
。想知道interfaceField的类型是一个接口,abstractField的类型是抽象的,concreteField的类型是具体的类

如果我调用
.getModifiers()
,我就得到了private。如果我调用
.getKind()
,我会得到“FIELD”。因此,它会告诉您
是否为
抽象类

    if (element.getModifiers().contains(Modifier.ABSTRACT)) { ... }
将告诉您它是否是一个
接口

    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);
}
鉴于以下类别:

public class MyClass {
    private Properties properties;
    private List<String> strings;
    // ...
}
公共类MyClass{
私人物业;;
私有列表字符串;
// ...
}
我得到以下输出:

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]
属性
type=java.util.Properties
修饰符=[专用]
种类=等级
修饰符=[公共]
串
type=java.util.List
修饰符=[专用]
种类=接口
修饰符=[公共,抽象]

对不起,我没有准确描述问题。在处理类时,您的答案可以很好地确定类型。但是有什么方法可以确定类内字段类型的信息吗?听起来像是想要
listfs=ElementFilter.fieldsIn(someClass.getencloseedelements())。然后,您可以检查每个
variablelement
,并在这些元素上调用
getKind()
和/或
getModifiers()
。这没有帮助。添加了一个示例。@ViktorShatrov用所需的中间步骤更新了答案,以获取
元素
您可以调用
getKind()
getModifiers()
on。您是说“反射API”而不是“镜像”?不,我是说
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]