मैं अपना खुद का एनोटेशन प्रोसेसर लिख रहा हूं और मैं किसी फ़ंक्शन के रिटर्न प्रकार को एनोटेट करने में सक्षम होना चाहता हूं।

यहाँ एनोटेशन के लिए कोड है:

@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 at org.jetbrains.kotlin.analyzer.AnalysisResult.throwIfError(AnalysisResult.kt:56) org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecode पर .compileModules$cli(KotlinToJVMBytecodeCompiler.kt:182) org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:165) पर org.jetbrains.kotlin.cli.jvm.K2JVMCompiler. :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) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(Native विधि) java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) पर java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562) पर /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) पर इसके कारण: जावा jdk.internal.reflect.GeneratedMethodAccessor122.invoke (अज्ञात स्रोत) पर java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java/43) पर .lang.reflect.InvocationTargetException org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:76) पर org.jetbrains.kotlin.kapt3.base.AnnotationProcessingKt.doAnnotationProcessing.doAnnotationProcessing एनोटेशनप्रोसेसिंग.केटी:35) org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.runAnnotationProcessing(Kapt3Extension.kt:224) पर org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt.:187) पर org पर .kapt3.ClasspathBasedKapt3Extension.analysisCompl eted(Kapt3Extension.kt:98) org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:97) पर org.clize. (TopDownAnalyzerFacadeForJVM.kt:107) org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM पर। Invoke(KotlinToJVMBytecodeCompiler.kt:557) org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:82) पर org.jetbrains.AndCompilerReport. (AnalyzerWithCompilerReport.kt:107) org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:548) पर org.jetbrains.kotli पर n.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:177) ... 22 और इसके कारण: com.sun.tools.javac.processing.AnnotationProcessingError: javax.lang.model.type:Mirrored jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:992) पर jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.Processing पर टाइपमिरर इंट के लिए क्लास ऑब्जेक्ट एक्सेस करने का प्रयास jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1222) पर jdk.compiler/com.sun.tools.javac.processing पर खोजेंAndRunProcs(JavacProcessingEnvironment.java:896)। jdk.compiler/com.sun.tools.javac.main पर jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1258) पर JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1334)। JavaCompiler.processAnnotations(Jav aCompiler.java:1157) ... 38 और इसके कारण: javax.lang.model.type.MirroredTypeException: टाइपमिरर इंट के लिए क्लास ऑब्जेक्ट तक पहुँचने का प्रयास jdk.compiler/com.sun.tools.javac.model.AnnotationProxyMaker$MirroredTypeExceptionProxy java.base/sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:86) पर .generateException(AnnotationProxyMaker.java:309) com.sun.proxy पर।$Proxy48.type(Unknown Source) एनोटेशन पर। CreateNoOpProcessor। org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt) पर org.jetbrains.kotlin.kapt3 पर जेनरेट क्लास (CreateNoOpProcessor.kt:64) एनोटेशन पर। .base.ProcessorWrapper.process(annotationProcessing.kt:147) jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980) पर ... 43 और

0
SoapyCro 19 पद 2019, 21:28

1 उत्तर

सबसे बढ़िया उत्तर

समाधान निम्न लिंक पर पाया जा सकता है: https://area -51.blog/2009/02/13/getting-class-values-from-annotations-in-an-annotationprocessor/

ट्रिक है मिररेड टाइप एक्सेप्शन को पकड़ना और उसमें से टाइपमिरर निकालना।

val returnType: TypeMirror? = try {
    method.getAnnotation(ReturnType::class.java)?.type
    null
} catch (e: MirroredTypeException) {
    e.typeMirror
}
0
SoapyCro 20 पद 2019, 09:28