Kotlin 反思:如何知道 Kotlin class 是否标有 "internal" 可见性修饰符
Kotlin Reflection: How to know if a Kotlin class is marked with "internal" visibility modifier
我正在使用 KotlinPoet 和自动服务自动生成代码。我没有找到任何方法来知道带注释的 class 是否具有 "internal" 修饰符,因此我可以创建另一个具有相同修饰符的 class 。例如:
@MyAnnotation
internal class Car
所以我想使用 Kotlin Reflection 我可以得到这些信息,但没有成功。
使用注释器处理器,我可以获得 KClass,但可见性显示 "public":
关于如何操作的任何线索?
Kotlin 的 KClass
有 visibility
属性,可以是 KVisibility.INTERNAL
.
由于 internal
是 visibility 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
Kotlin 反射在注释处理期间不适用。 Kotlin 反射用于在 运行时 检查您的代码。
然而,有一种方法可以从 Kotlin class 文件中解析出元数据,它被称为 kotlinx-metadata-jvm.
要在注释处理器中使用它,您必须获得 kotlin.Metadata
注释的 AnnotationMirror
。从该镜像中,获取注释值并使用它们构造 KotlinClassHeader
,如您在 kotlinx-metadata-jvm 的示例中所见。到达那里后,您可以使用 kotlinx-metadata-jvm 为您的 class.
提取标志
我正在使用 KotlinPoet 和自动服务自动生成代码。我没有找到任何方法来知道带注释的 class 是否具有 "internal" 修饰符,因此我可以创建另一个具有相同修饰符的 class 。例如:
@MyAnnotation
internal class Car
所以我想使用 Kotlin Reflection 我可以得到这些信息,但没有成功。
使用注释器处理器,我可以获得 KClass,但可见性显示 "public":
关于如何操作的任何线索?
Kotlin 的 KClass
有 visibility
属性,可以是 KVisibility.INTERNAL
.
由于 internal
是 visibility 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
Kotlin 反射在注释处理期间不适用。 Kotlin 反射用于在 运行时 检查您的代码。 然而,有一种方法可以从 Kotlin class 文件中解析出元数据,它被称为 kotlinx-metadata-jvm.
要在注释处理器中使用它,您必须获得 kotlin.Metadata
注释的 AnnotationMirror
。从该镜像中,获取注释值并使用它们构造 KotlinClassHeader
,如您在 kotlinx-metadata-jvm 的示例中所见。到达那里后,您可以使用 kotlinx-metadata-jvm 为您的 class.