注解处理异常:无法分析:java.lang.reflect.InvocationTargetException

问题描述 投票:0回答:2

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

这是注释的代码:

@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:无法分析:java.lang.reflect.InvocationTargetException在org.jetbrains.kotlin.analyzer.AnalysisResult.throwIfError(AnalysisResult.kt:56)在org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules $ cli(KotlinToJVMBytecodeCompiler.kt:182)在org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:165)在org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:55)在org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84)在org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42)在org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104)在org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1558)在jdk.internal.reflect.GeneratedMethodAccessor104.invoke(未知来源)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(本机方法)在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)在java.base / java.security.AccessController.doPrivileged(本机方法)java.rmi / sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:676)在java.base / java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)在java.base / java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:628)在java.base / java.lang.Thread.run(Thread.java:834)造成原因:java.lang.reflect.InvocationTargetException在jdk.internal.reflect.GeneratedMethodAccessor122.invoke(未知来源)在java.base / jdk.internal.reflect.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)在org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing $ default(annotationProcessing.kt:35)在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)在org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:107)在org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration $ default(TopDownAnalyzerFacadeForJVM.kt:82)在org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler $ analyze $ 1.invoke(KotlinToJVMBytecodeCompiler.kt:557)在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.analyze(KotlinToJVMBytecodeCompiler.kt:548)在org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules $ cli(KotlinToJVMBytecodeCompiler.kt:177)... 22更多原因:com.sun.tools.javac.processing.AnnotationProcessingError:javax.lang.model.type.MirroredTypeException:尝试访问ClassTypeMirror int的对象jdk.compiler / com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:992)在jdk.compiler / com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:896)在jdk.compiler / com.sun.tools.javac.processing.JavacProcessingEnvironment $ Round.run(JavacProcessingEnvironment.java:1222)在jdk.compiler / com.sun.tools.javac.processing.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:尝试访问TypeMirror int的Class对象jdk.compiler / com.sun.tools.javac.model.AnnotationProxyMaker $ MirroredTypeExceptionProxy.generateException(AnnotationProxyMaker.java:309)在java.base / sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:86)位于com.sun.proxy。$ Proxy48.type(未知来源)注解.CreateNoOpProcessor.generateClass(CreateNoOpProcessor.kt:64)在注解.CreateNoOpProcessor.process(CreateNoOpProcessor.kt:43)在org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt)在org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:147)在jdk.compiler / com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)... 43更多

kotlin annotation-processing annotation-processor
2个回答
0
投票

嗯,是一个非常有趣的问题,我在一段时间之前遇到过,但是忘记了我是如何解决的。祝您好运。


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
}
© www.soinside.com 2019 - 2024. All rights reserved.