0

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

这是注释的代码:

@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.FUNCTION)
annotation class ReturnType(val type: KClass<*>)

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

annotatedElement.enclosedElements
    .filter { it.kind == ElementKind.METHOD }
    .forEach { method ->
        val returnType = method.getAnnotation(ReturnType::class.java).type
    }

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

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 个

4

1 回答 1

0

可以在以下链接中找到解决方案: https ://area-51.blog/2009/02/13/getting-class-values-from-annotations-in-an-annotationprocessor/

诀窍是捕获 MirroredTypeException 并从中提取 typeMirror 。

val returnType: TypeMirror? = try {
    method.getAnnotation(ReturnType::class.java)?.type
    null
} catch (e: MirroredTypeException) {
    e.typeMirror
}
于 2019-12-20T09:28:52.510 回答