问题标签 [annotation-processor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
597 浏览

annotation-processing - 在我项目的源码包下生成java源码

我有我的注释处理器:

在上述process回调中处理注释元素后,我使用JavaPoet生成 java 源代码并为代码创建 Java 文件。构建我的项目时,除了生成的 java 源代码文件默认转到build/generated/sources/myApp/com/my/foo. 如何使生成的 Java 文件位于项目的源代码位置src/main/java/com/my/foo

我的 gradle 构建:

0 投票
2 回答
737 浏览

java - 有没有办法在 Scala 中创建自定义注释并编写自定义注释处理器来验证注释?

我一直在学习注释以及注释处理器是什么。我正在查看 Java 示例,似乎有一种正确的方法可以做到这一点。但是,在 Scala 中,我没有获得合适的网站/文档来创建自定义注释和注释处理器。

如果在 Scala 中不可能,有没有办法在 Scala 类中使用 Java 自定义注释处理器?

有人可以指出我正确的方向吗?

0 投票
1 回答
661 浏览

java - 注释处理器与其他注释处理器创建的Java注释处理编辑文件

我正在尝试通过 Java 8 中的编译时注释处理为我的源代码生成一个配置文件。

据我了解,对于getSupportedAnnotationTypes类中列出的每个注释,处理器都会被调用一次。

实际上,我不想用一个注释处理器处理所有这些注释(这是正确的方法吗?),因为它会导致MCCommand注释出现问题。所以我的计划是创建另一个注释处理器,它只处理MCCommand注释。

我的问题是,两个处理器的输出应该进入同一个输出文件。(这甚至可能吗?)

我已经尝试过像这样重新打开资源文件(这也是我首先打开它的方式):

这只会产生错误或覆盖现有文件。

TlDr:如何让我的注释处理器编辑另一个注释处理器生成的文件?

0 投票
0 回答
96 浏览

java - 使用 AbstractProcessor 获取所有字段,包括来自 Element 中的继承的非直接字段

我正在编写一个工具来从 POJO 中生成 JSON 模式,并使用一些自定义注释使用更多数据来增强它。我在编译期间使用 AbstractProcessor 和 Gradle 运行 AnnotationProcessor。我遇到的最大问题是获取类中的字段列表(在本例中为 Element):

getEnclosedElements只返回直接定义的字段。例如,如果从另一个类继承的类我不能在我的列表中定义父类的字段。有什么建议可以找出所有领域,包括那些来自继承的领域?

0 投票
1 回答
123 浏览

java - 为什么 getSimpleName() 在 com.sun.tools.javac.tree.JCTree$JCClassDecl 中出现两次

我在应用程序代码中有一个奇怪的错误,它是一个注释处理器,我可以发现错误的根本原因是当我使用反射方法查询类时,该类com.sun.tools.javac.tree.JCTree$JCClassDecl包含该方法两次。这两个版本仅在返回类型上有所不同。这在 JVM 代码中是合法的,但在 Java 中是不合法的。这不是方法重载,因为只有返回类型不同,返回类型不是方法签名的一部分。getSimpleName()getMethods()

这个问题可以用简单的代码来演示:

它会打印

(省略号代表更多的输出行,显示了我们现在不感兴趣的各种其他方法。)

我用来测试的Java版本是

在 Windows 10 机器上。

问题:这个类代码是如何创建的?我的理解是这部分代码是用Java编写的,但是在Java中这是不可能的。另外:拥有两个相同签名版本的方法的目的是什么?有什么提示吗?

0 投票
1 回答
289 浏览

java - 从注解处理器生成 Spring 组件

我正在使用自定义AbstractProcessor来生成一些类。我尝试生成 Spring 组件 A 和 B,其中 B“自动装配”A。输出类看起来类似于:

但是 autowiredmyClassA是空的。我怀疑春季扫描是在我的课程开始之前发生的。

当我运行时,mvn clean install 我有

spring-boot-maven-plugin这表明maven-install-plugin. 这是我的“注释处理器”项目中使用的插件配置:

关于如何确保我生成的组件可以自动装配的任何提示?

谢谢。

0 投票
1 回答
1948 浏览

kotlin - 注解处理异常:分析失败:java.lang.reflect.InvocationTargetException

我正在编写自己的注释处理器,我希望能够注释函数的返回类型。

这是注释的代码:

以及来自注释处理器的部分代码:

当我尝试编译代码时,出现以下异常:

java.lang.IllegalStateException:分析失败:org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler 的 org.jetbrains.kotlin.analyzer.AnalysisResult.throwIfError(AnalysisResult.kt:56) 处的 java.lang.reflect.InvocationTargetException .compileModules$cli(KotlinToJVMBytecodeCompiler.kt:182) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:165) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt :55) 在 org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42) 在 org.jetbrains 的 org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84)。 kotlin.cli.common.CLITool.exec(CLITool.kt:104) 在 jdk.internal.reflect.GeneratedMethodAccessor104 的 org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1558)。调用(未知来源)在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 java。 rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359) 在 java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) 在 java.rmi/sun.rmi.transport .Transport$1.run(Transport.java:197) 在 java.base/java.security.AccessController.doPrivileged(Native Method) 在 java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) 在java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562) 在 java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796) 在 java. rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler。lambda$run$0(TCPTransport.java:677) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:第676章/java.lang.Thread.run(Thread.java:834) 原因:java.base/jdk.internal.reflect 的 jdk.internal.reflect.GeneratedMethodAccessor122.invoke 中的 java.lang.reflect.InvocationTargetException。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt。doAnnotationProcessing(annotationProcessing.kt:76) at org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing$default(annotationProcessing.kt:35) at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.runAnnotationProcessing(Kapt3Extension.kt:224)在 org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:187) 在 org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:98) 在 org.jetbrains.kotlin.cli.jvm.compiler .TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:97) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:107) at org.jetbrains.kotlin.cli.jvm.compiler. TopDownAnalyzerFacadeForJVM。analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:82) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:557) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler $analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:82) 在 org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107) 在 org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler。 org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:177) 上的分析(KotlinToJVMBytecodeCompiler.kt:548)... 22 更多原因:com.sun.tools.javac.processing .AnnotationProcessingError:javax.lang.model.type.MirroredTypeException:尝试在 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment 访问 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:992) 的 TypeMirror int 的 Class 对象。在 jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1222) 在 jdk.compiler/com.sun.tools.javac.processing 发现AndRunProcs(JavacProcessingEnvironment.java:896)。 JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1334) 在 jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1258) 在 jdk.compiler/com.sun.tools.javac.main。 JavaCompiler.processAnnotations(JavaCompiler.java:1157) ... 38 更多原因:javax.lang.model.type.MirroredTypeException:尝试在 java.base/sun.reflect.annotation.AnnotationInvocationHandler.invoke( AnnotationInvocationHandler.java:86) 在 com.sun.proxy.$Proxy48.type(Unknown Source) 在 annotation.CreateNoOpProcessor.generateClass(CreateNoOpProcessor.kt:64) 在 annotation.CreateNoOpProcessor.process(CreateNoOpProcessor.kt:43) 在 org. jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt) 在 jdk.compiler/com.sun.tools 的 org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:147)。 javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980) ...还有 43 个

0 投票
1 回答
291 浏览

kotlin - 从注解中获取静态字段的值

我想从声明的注释中的静态字段中获取值。例子:

我想获得“test123”作为价值。

到目前为止,我可以这样获得名称和种类Element

是否有可能以某种方式获得“test123”?

0 投票
1 回答
151 浏览

java - 我们可以使用注释处理从 Rest 控制器中自行生成客户端吗?如果我们可以,那么我该如何进行?

https://github.com/aashrai/brahma-dao),类似于这个 DAO 生成器,我们可以做注释处理来生成一个休息控制器的客户端吗?

PS:我正在使用带有 gradle 的 Spring Boot。

0 投票
1 回答
126 浏览

java - maven-compiler-plugin:为增量构建添加额外的依赖项

我想用一个带有长的多行字符串常量的类来构造一个 java 类文件。(将字符串放入单独的文件并从与类相同的 JAR 加载它的常用方法不是一个选项。不会有 JAR,只有那个类文件。)最初,我使用的是多行字符串注释处理器,它允许将字符串内容放在文档注释中:

在这里我误以为:“哦,注释不方便,为什么不更改多行字符串以从外部文件加载内容?” 事实证明这是可行的,但是 maven(我正在使用它来构建)当然不明白如果注释处理器读取的文件发生更改,则需要重新编译类文件。

方法:

  • 设置useIncrementalCompilationfalse:根本不符合我的预期,而是禁用增量构建的依赖项检查
  • 添加.pyfileExtensions(没想到会起作用)
  • 添加maven-clean-plugin作为初始化阶段的一部分:这可行,但有点矫枉过正......</li>

我真正想做的是将嵌入文件的路径添加到 maven 的“如果此文件更改,请重新编译该文件”列表中。这是可能的,还是有另一种优雅的方法来解决这个问题?