Java 注释处理器:检查 TypeMirror 是否实现了特定的接口

我正在使用Java注释处理器。我的注释用于标记可在运行时读取到文件或从文件读取的字段变量。但是,我想检查变量类型是否在编译时实现,以便如果字段不可序列化,我可以在编译时给出警告/错误。@fooSerializable

(我不需要实际检查对象是否是可序列化的,如果它实现了接口,我会信任它)。Serializable

我已经弄清楚了如何做其他事情,但是我不知道如何检查元素是否实现。我可以使用该方法,但我不知道如何检查返回的这些中是否有任何一个是.SerializableTypeElement#getInterfacesTypeMirrorSerializable

另外,如果有人碰巧知道任何好的Java注释教程,那也会有所帮助。java.lang.model

编辑:我已经试过了这个...

isSerializable = false  
for(TypeMirror tm : processingEnv.getTypeUtils().directSupertypes(em.asType()))  
{  
if(isSerializable = "java.io.Serializable".equals(tm.toString()))  
{  
break;  
}  
}  

它适用于直接实现的字符串和字符,但对于从 Number 超类继承可序列化的整数,它不起作用。Serializable


答案 1

不应检查直接超类型,而应使用 Types.isAssignable 来检查 是否为 的超类型之一SerializableTypeMirror

TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType();
boolean isSerializable = typeUtil.isAssignable(tm, serializable);

答案 2