注释处理器:如何知道 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")
}
...
}
我正在使用 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")
}
...
}