我正在使用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; } }
它适用于直接实现的String和Character,Serializable
但是对于从Number超类继承Serializable的Integer,它不起作用.
而不是检查直接超的,你应该使用Types.isAssignable
检查,如果Serializable
是一个的的超类型TypeMirror
:
TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType(); boolean isSerializable = typeUtil.isAssignable(tm, serializable);