gpt4 book ai didi

java - 二进制/合格名称错误?以 : $ 开头

转载 作者:行者123 更新时间:2023-11-30 12:06:21 25 4
gpt4 key购买 nike

我正在运行我编写的注解处理器。它在 JDK 8 上运行良好,但现在我在 JDK 12 上遇到了问题。

我有一个 TypeElement我想检索它的二进制名称以传递给 Class.forName .

我使用 javax.lang.model.util.Elements.getBinaryName(TypeElement)它返回一个垃圾值 <any?>$OuterClass.InnerClass而不是预期的 example3.OuterClass$InnerClass .

我试图替换 getBinaryNameTypeElement.getQualifiedName (即使它不太适用于内部类)但它给了我同样的垃圾结果。我曾尝试搜索此问题,但大多数搜索引擎都会删除所有特殊字符并给我无用的结果。

TypeElement是通过捕捉 MirroredTypeException 获得的像这样:

try {
exampleAnnotation.value();
throw new IllegalStateException("Expected a MirroredTypeException.");
} catch (MirroredTypeException ex) {
return (TypeElement) types.asElement(ex.getTypeMirror());
}

这里是 ExampleAnnotation 的定义:

package example1;

@Target(PACKAGE)
@Retention(RUNTIME)
@Documented
public @interface ExampleAnnotation {
Class<? extends Derived> value() default Derived.class;

interface Derived<A extends Annotation> extends Base<A> {
String foo();
}
}

这里是处理器正在访问的注释实例 package-info.java :

@ExampleAnnotation(OuterClass.InnerClass.class)
package example2;
import example1.ExampleAnnotation;

我也试过全限定名example3.OuterClass.InnerClass.class但这也会导致垃圾:<any?>$example3.OuterClass.InnerClass .

我怀疑这是否重要,但注释处理器仍标记为 @SupportedSourceVersion(SourceVersion.RELEASE_8)我在 Gradle 5.3.1 上运行它。

我已验证处理器路径包含包 example1 和 example3 的 jar,包括注释处理器。

我没有对模块系统进行任何更改,所以我想这可能会以某种方式影响代码。

刚刚尝试创建一个 Maven 项目,目前无法重现该问题,因此我的 Gradle 配置可能存在问题,类似于@Colin Alworth 的建议。

最佳答案

我最近升级到新版本的 Gradle 并开始使用“annotationProcessor”依赖项。

看来 <any?>$如果该类不在 classpath 上,则将其添加到二进制/限定类名之前(如源代码中所示) (或者如果它不是进口的,或者拼写错误)。我在 processorpath 上只有注释的 jar .

为了提醒我的注释处理器的消费者注意这个错误,我能够通过比较 TypeElement.asType().getKind() == TypeKind.ERROR 来检测它捕获MirroredTypeException后立即.

关于java - 二进制/合格名称错误?以 : <any? >$ 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55627497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com