为什么 Types.isAssignable() 提供交替结果?

问题描述

我目前正在使用 Java 注释处理器调查我们的一个项目中的问题。

我们实现了一个注解处理器,它应该从一些其他类的字段上的注解 (@Attribute) 生成一些新类,如果此注解位于无效类型 (Member) 的字段上,也会引发编译器错误

就像这样:

@Attribute
private Member some_field; // this is compliant
@Attribute
private Object some_other_field; // this is not compliant,because not of type Member.

现在检查处理器当前是否正在查看成员类型的字段。 在我们的例子中,这看起来像这样:

TypeMirror memberType = processingEnv.getElementUtils().getTypeElement(Member.class.getName()).asType();
TypeMirror fieldType = processingEnv.getTypeUtils().erasure(element.getType());
boolean isAssignable = processingEnv.getTypeUtils().isAssignable(fieldType,memberType);

现在我面临一个相当奇怪的行为:isAssignable() 检查大约每第二次这些类中的一个被更改并且必须重建时返回 false。所以每次我用这个注释更改这样一个类时,我都会收到一堆编译器错误,只要我再次对该文件进行任何更改(例如添加空格),它们就会消失。

我现在已经到了尽头,因为我不知道如何正确调查这个问题。例如,将这个 TypeMirror 的类型放在生成的编译器错误中,只会向我表明它们完全相同,这让我更加困惑。

我们目前使用的是 Eclipse 2020-12 和 jdk-11.0.10+9。

我很感激就此事提供的各种提示,并将尽力提供解决问题可能需要的所有信息。

您好。

编辑: 我们终于找到了解决方案,这里没有人可以帮助我,因为我忽略了一个很小但很重要的信息:在进行 isAssignable() 检查时,我们并不总是得到这个 TypeMirror,如我发布的代码片段所示,但在开始时缓存了它AnnotationProcessor 运行。因此,似乎在某些情况下,另一个类加载器开始发挥作用,尽管类对象看起来完全相同,但它们并不相同并引起了我们的困惑。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)