Java Annotations Processor:检查TypeMirror是否实现特定接口

时间:2013-12-03 17:42:39

标签: java reflection annotations annotation-processing

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

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

我已经想出了如何做其他事情,但我无法弄清楚如何检查元素是否实现Serializable。我可以使用TypeElement#getInterfaces方法,但我无法弄清楚如何检查这些TypeMirror中的任何一个是Serializable的那个。

此外,如果有人碰巧知道任何好的java.lang.model或Java Annotations教程,那么这也会有所帮助。

编辑:我试过了......

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

它适用于直接实现Serializable的String和Character,但对于从Number超类继承Serializable的Integer,它不起作用。

1 个答案:

答案 0 :(得分:27)

您应该使用Types.isAssignable来检查Serializable的超级类型中是否{em} ,而不是检查直接超类型。

TypeMirror