如何使用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]