1

我正在使用自动服务来处理一些注释,但我无法确定 Kotlin 类是否具有来自注释处理器 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"

样本类:

@MyAnnotation
internal class Car

我在 process 方法中得到了 this 的 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

但我不知道如何检测该类是否具有“内部”修饰符。

如果我这样做:classElement.modifiers我得到这个: 在此处输入图像描述

关于如何检测“内部”修饰符的任何想法?

4

1 回答 1

3

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

元数据注释以二进制形式为您提供有关 Kotlin 声明的一些信息。您可以使用Kotlinx-metadata来读取和修改.class文件的元数据。

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

例如:

override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
    if (Flag.IS_INTERNAL(flags)) {
        println("function $name is internal")
    }
    ...
} 
于 2018-10-29T06:57:27.577 回答