注释处理器:如何知道 Kotlin class 是否标有来自 Element 的“内部”可见性修饰符

Annotation Processor: How to know if a Kotlin class is marked with “internal” visibility modifier from Element

我正在使用 Auto Service 来处理一些注释,但我无法确定 Kotlin class 是否具有注释处理器 "internal" 可见性修饰符 API.

我在处理器中使用 KAPT 和 Kotlin。依赖项:

    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: "1.3.0-rc-190"
    implementation files("${System.properties['java.home']}/../lib/tools.jar")
    implementation 'com.squareup:kotlinpoet:1.0.0-RC2'
    implementation "com.google.auto.service:auto-service:1.0-rc4"
    kapt "com.google.auto.service:auto-service:1.0-rc4"

样本Class:

@MyAnnotation
internal class Car

我在 process 方法中得到了这个的 TypeElement

override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(MyAnnotation::class.java).forEach { classElement ->
            if (classElement.kind != ElementKind.CLASS) {
                error(...)
                return true
            }
            classElement as TypeElement

但我不知道如何检测 class 是否具有 "internal" 修饰符。

如果我这样做:classElement.modifiers 我明白了:

知道如何检测 "internal" 修饰符吗?

当您的 Kotlin 代码转换为 .class 形式时,没有 internal 修饰符。但是当你反编译 Kotlin 代码的 .class 文件时,你会看到有一个 @Metadata 注释。

metadata annotation gives you some information about Kotlin declarations in the binary form. You can use Kotlinx-metadata 用于读取和修改 .class 个文件的元数据。

因此,您需要从 classElement 获取 @Metadata 注释,然后使用 kotlinx-metadata 的标志来确定它是否具有内部修饰符:

例如:

override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
    if (Flag.IS_INTERNAL(flags)) {
        println("function $name is internal")
    }
    ...
}