我正在使用 Java 注释处理器。我的注释 @foo
用于标记可以在运行时读取到文件或从文件中读取的字段变量。但是,我想在编译时检查变量类型是否实现了 Serializable
,这样如果该字段不可序列化,我可以在编译时给出警告/错误。
(我不需要实际检查对象是否可序列化,如果它实现了 Serializable
接口(interface),我会相信它)。
我已经想出了如何做其他的事情,但我不知道如何检查元素是否实现了 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 父类(super class)继承 Serializable 的 Integer 无效。
最佳答案
您应该使用 Types.isAssignable
而不是检查直接父类(super class)型检查 Serializable
是否是 TypeMirror
的父类(super class)型之一:
TypeMirror serializable = elementUtil.getTypeElement("java.io.Serializable").asType();
boolean isSerializable = typeUtil.isAssignable(tm, serializable);
关于Java 注释处理器 : Check if TypeMirror implements specific interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20358039/