我想检测JVM类是否是Kotlin类

Jay*_*ard 14 reflection kotlin

如果我遇到Kotlin类而不是通用Java类,我想要做特殊功能.如何检测它是否是Kotlin类?

someClass.kotlin如果班级不是Kotlin ,我希望调用会抛出异常或失败.但它包装Java类就好了.然后我注意到,如果我这样做someClass.kotlin.primaryConstructor似乎是null所有java类,即使他们有一个默认的构造函数,这是一个很好的标记?但这也可以null归功于Kotlin课程吗?

什么是最好的方式说"这是一个科特林课程吗?"

Jay*_*ard 16

Kotlin为其所有类添加了注释,您可以通过名称安全地检查其存在.这是一个实现细节,可能会随着时间的推移而改变,但是一些关键库使用这个注释,因此它可能无限期地存在.

fun Class<*>.isKotlinClass(): Boolean {
    return this.declaredAnnotations.any {
        it.annotationClass.qualifiedName == "kotlin.Metadata"
    }
}
Run Code Online (Sandbox Code Playgroud)

可以用作:

someClass.isKotlinClass()
Run Code Online (Sandbox Code Playgroud)

kotlin.Metadata不会直接访问该类,因为它已internal在Kotlin运行时中标记.

  • 啊。它似乎可以从 Java 访问。例如,我为 Spring 框架编写了这个(未合并的)拉取请求:https://github.com/spring-projects/spring-framework/pull/1060/files#diff-244315b45582a5b7573a15644b16c373R48(是的,他们希望它用 Java 编写, eek)。 (2认同)
  • 元数据在 Kotlin 1.2 中是“内部”,但在 Kotlin 1.3 中是“公共” (2认同)