Java 注释处理器 : Check if TypeMirror implements specific interface

标签 java reflection annotations annotation-processing

我正在使用 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/

相关文章:

java - 将类引用传递给注入(inject)实例的更好方法

java - 如何为 Cobol copybook 生成 java~jrecord 代码

java - 字符串如何验证空间

python - 如何获得谁调用了函数或方法?

c# - 从 C# 中检索程序集的 MVID?

java - 注释(bean 验证)不起作用

java - 如何在 IntelliJ 中禁用 "Access can be package-private"消息?

java - 符号曾经从何而来?

java - java中使用反射从类绝对路径获取类属性

iphone - MapView注解indexPath?