美文网首页
Android 注解处理器中的MirroredTypeExcep

Android 注解处理器中的MirroredTypeExcep

作者: 魁地奇 | 来源:发表于2020-05-11 18:29 被阅读0次

    在AOP开发中我们经常通过ElementgetAnnotation(Class<A> var1)方法去获取自定义注解中的传入的属性

    例如:

    @Target(AnnotationTarget.FIELD)
    @Retention(AnnotationRetention.SOURCE)
    @MustBeDocumented
    annotation class TTEventType(val value: KClass<*>)
    

    当我们获取KClass<*>类型时会出现javax.lang.model.type.MirroredTypeException,这是因为

    The annotation returned by this method could contain an element whose value is of type Class. This value cannot be returned directly: information necessary to locate and load a class (such as the class loader to use) is not available, and the class might not be loadable at all. Attempting to read a Class object by invoking the relevant method on the returned annotation will result in a MirroredTypeException, from which the corresponding TypeMirror may be extracted. Similarly, attempting to read a Class[]-valued element will result in a MirroredTypesException.

    处理一

    如果硬要从getAnnotation()获取则可以利用MirroredTypeException

    public class MirroredTypeException
    extends MirroredTypesException
    
    Thrown when an application attempts to access the Class object corresponding to a TypeMirror.
    

    从异常捕获中获取TypeMirror

        inline fun <reified T : Annotation> Element.getAnnotationClassValue(f: T.() -> KClass<*>) =
            try {
                getAnnotation(T::class.java).f()
                throw Exception("Expected to get a MirroredTypeException")
            } catch (e: MirroredTypeException) {
                e.typeMirror
            }
    

    处理二

    我们从AnnotationMirror下手 在List<? extends AnnotationMirror> getAnnotationMirrors()方法中获取:

    
    private fun getEventTypeAnnotationMirror(typeElement: VariableElement, clazz: Class<*>): AnnotationMirror? {
            val clazzName = clazz.name
            for (m in typeElement.annotationMirrors) {
                if (m.annotationType.toString() == clazzName) {
                    return m
                }
            }
            return null
        }
    
        private fun getAnnotationValue(annotationMirror: AnnotationMirror, key: String): AnnotationValue? {
            for ((key1, value) in annotationMirror.elementValues) {
                if (key1!!.simpleName.toString() == key) {
                    return value
                }
            }
            return null
        }
        private fun getMyValue(foo: VariableElement, clazz: Class<*>, key: String): TypeMirror? {
            val am = getEventTypeAnnotationMirror(foo, clazz) ?: return null
            val av = getAnnotationValue(am, key)
            return if (av == null) {
                null
            } else {
                av.value as TypeMirror
            }
    
        }
    
    
      val typeMirror = getMyValue(variableElement,TTEventType::class.java,"value")
      
        messager.printMessage(Diagnostic.Kind.NOTE, " --typeMirror-- $typeMirror")
    

    参考

    Getting Class values from Annotations in an AnnotationProcessor

    相关文章

      网友评论

          本文标题:Android 注解处理器中的MirroredTypeExcep

          本文链接:https://www.haomeiwen.com/subject/telpnhtx.html