我正在编写一个注释处理器,并希望根据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/