当前位置: 首页 > 知识库问答 >
问题:

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

萧胜
2023-03-14

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

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

我已经知道如何做其他事情,但我不知道如何检查元素是否实现了Serializable。我可以使用TypeElement#getInterface方法,但我不知道如何检查返回的这些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;  
}  
}  

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

共有1个答案

慕逸仙
2023-03-14

您应该使用<code>类型,而不是检查直接超类型。isAssignable检查可串行化是否为类型镜像的超类型之一:

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

 类似资料:
  • 问题内容: 我正在使用反射来查看附加到类的属性的注释是否具有特定类型。目前我正在做: 这让我有些不高兴,因为它依赖于完全合格的类名称的字符串。如果将来更改命名空间,则可能会导致细微的错误。 我想要做: 但是是抽象类,无法实例化。有没有一种方法可以针对接口或抽象类进行模拟(或基本上使用)? 问题答案: 你只是在寻找 ?

  • 在静态编程语言1.3.30中,添加了对增量注释处理的支持:https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/根据文档: 请注意,在当前实现中,使用任何非增量注释处理器或依赖项的 ABI 更改(到目前为止,包括修改内部声明)将导致给定模块的非增量注释处理。 我有一个带有多个注释处理器的多模块项目。只有一部分是增量的。至少

  • 众所周知,我们可以像ProjectLombook的工作人员一样,使用自定义注释和Java注释处理器自动生成代码。但是我们可以从编译的源代码中删除带注释的代码吗? 我试着在网上搜索它,但只出现了“生成代码”主题和“如何生成带有一个注释的服务器”教程。当我在寻找从prod应用程序“编译”调试消息的方法时,我想到了这一点。我可以理解,拥有调试/测试和生产代码不是一个好的实践,但有时需要保持简单。我认为这

  • 问题内容: 如何检查某个类是否实现接口?当有: 如何检查是否实现接口? 该方法是否被正确覆盖,因此可以返回新创建的方法? 问题答案: 对于一个实例 然后做 对于Class实例

  • 我有如下注释的类: 从这个意义上说,我希望标识类并为它们创建对象,并将它们放在的一般中。 我如何使用反射和Java来做到这一点?

  • 我使用抽象处理器创建了一个自定义注释和注释处理器。这意味着我想在编译之前进行注释处理。我将自定义注释和处理器导出为Jar,并尝试将其与简单的java测试程序一起使用。我确信在编译时它会找到我的java处理器类,但不知何故,我并没有得到我在控制台上期望的o/p。下面是我的处理器中处理方法的代码。 此外,我故意使用以便我得到一个版本警告,它确认当我执行一个测试类时,它找到了我的注释处理器。 这里是我的