【问题标题】:Kotlin Reflection: How to know if a Kotlin class is marked with "internal" visibility modifierKotlin 反射:如何知道 Kotlin 类是否标有“内部”可见性修饰符
【发布时间】:2019-04-01 18:07:21
【问题描述】:

我正在使用 KotlinPoet 和 Auto Service 自动生成代码。我没有找到任何方法来知道带注释的类是否具有“内部”修饰符,因此我可以创建另一个具有相同修饰符的类。例如:

@MyAnnotation
internal class Car

所以我认为使用 Kotlin Reflection 可以获得这些信息,但没有运气。

使用注释器处理器,我可以获得 KClass,但可见性显示为“公共”:

关于如何做的任何线索?

【问题讨论】:

    标签: kotlin kotlin-reflect kotlinpoet


    【解决方案1】:

    注释处理期间不适用 Kotlin 反射。 Kotlin 反射用于在运行时检查您的代码。 但是有一种方法可以从 Kotlin 类文件中解析元数据,它被称为 kotlinx-metadata-jvm

    要在您的注释处理器中使用它,您必须获得kotlin.Metadata 注释的AnnotationMirror。从该镜像中,获取注释值并使用它们来构造 KotlinClassHeader,如您在 kotlinx-metadata-jvm 的示例中所见。到达那里后,您可以使用 kotlinx-metadata-jvm 为您的班级提取标志。

    【讨论】:

      【解决方案2】:

      Kotlin 的KClass 具有visibility 属性,可以是KVisibility.INTERNAL

      【讨论】:

      • 我正在这样做,但我看到的是“公共”而不是“内部”。使用代码:(classElement as Symbol).type::class.visibility
      • x.type::class 将返回 Symbol.type aka KClass<com.sun.tools.javac.code.Type> 的 KClass,这是一个公共类。如果已处理的类在类路径上,则加载该类然后反映到 KClass 中将为您提供所需的信息。否则,您需要以某种方式解析 kotlin 嵌入其所有类中的 @Metadata 注释。
      • 我做到了(正如您在问题的图像预览中看到的那样),但仍然无法获得该值。我尝试解析元数据,但我也没有在那里找到它。我错过了什么吗?
      • 在图片中我看到您访问.type::class,这并没有按照您的想法进行。 ::class 返回调用它的类型的 KClass,所以由于 .type 返回一个 com.sun.tools.javac.code.Type,即您正在访问的 KClass。
      • 天哪,你是完全正确的。我真的不知道如何从注释处理中获取 KClass 以获取此信息
      【解决方案3】:

      由于internalvisibility modifier,您应该在KClass API 中查找相关内容。以下内容将为您提供帮助:

       /**
       * Visibility of this class, or `null` if its visibility cannot be represented in Kotlin.
       */
      @SinceKotlin("1.1")
      public val visibility: KVisibility?
      

      这样使用:Car::class.visibility //INTERNAL

      【讨论】:

      猜你喜欢
      • 2015-09-06
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2021-11-18
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多