当前位置: 首页 > 知识库问答 >
问题:

我想检测JVM类是否是Kotlin类

澹台镜
2023-03-14

如果我遇到静态编程语言类而不是泛型Java类,我想执行特殊功能。如何检测它是否是静态编程语言类?

我希望调用一些Class.kotlin会引发异常或失败,如果类不是科特林。但它很好地包装了Java类。然后我注意到,如果我做一些Class.kotlin.primary构造函数,它似乎对所有java类都是空的,即使它们有一个默认的构造函数,这是一个好的标记吗?但是,对于科特林类,这是否也返回值?

说“这是静态编程语言课吗?

共有2个答案

伊铭
2023-03-14

虽然另一个答案可能有效(可能已经过时),但许多反射特性在文件类或生成类(lambdas等)上不起作用。

但是,@Metadata注释中有一个参数可以告诉您该类是否是您要查找的:

此批注编码的一种元数据。柯特林编译器识别以下类型(请参见柯特林类标题.Kind):

1类
2文件
3合成类
4多文件类外观
5多文件类部分

此处未列出的类文件被视为非Kotlin文件。

@get:JvmName("k")
val kind: Int = 1

我们可以利用这一点来确保我们只得到真正的类:

val Class<*>.isKotlinClass get() = getAnnotation(Metadata::class.java)?.kind == 1

我可以在1.6.20中确认这一点

白腾
2023-03-14

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

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

可用作:

someClass.isKotlinClass()

< code>kotlin类。元数据不能被直接访问,因为它在Kotlin运行时被标记为< code>internal。

 类似资料:
  • 问题内容: 我想知道一个类是否为枚举,但是我想我缺少了一些东西: 它给我一个错误,指出Enum.class无效。那么,如何检查类是否为枚举?我很确定有可能确定这一点,但我无法做到。 谢谢 问题答案: 正确的语法为: 但对于枚举,这是一种更方便的方法: 更新:对于带有主体的枚举项(例如,覆盖方法),这实际上将不起作用。在这种情况下,请使用 参考:

  • 我的应用程序中有一个,我想检查一下,用户是否向下滚动了,例如,如果用户向下滚动了我的,我想显示一条消息,“you scrolled down”我在过去3天里一直在尝试这个,我没有得到任何合适的解决方案。我看过很多教程和讨论,没有一个适合我。有人能帮忙吗? 这是我的java代码片段 这是我的xml文件 添加答案后的错误消息 此检查扫描应用程序中的所有调用,并警告此应用程序目标的所有版本上不可用的任何

  • 我读过https://projectlombok.org/features/equalsandHashCode几次,从中得出了不同的结论。 下面是我正在做的一个例子来帮助澄清我的问题: GeneratorTypeB看起来与上面的代码段完全相同。现在说我有以下几点: 我用来组合集合的代码在这个设置中工作得很好,但是我要处理的数据很多,所以遇到equals方法中使用的重复的唯一标识符的几率很低,但是它

  • 问题内容: 我有一个Java课。如何检查该类是否包含JUnit4测试的方法?我是否必须使用反射对所有方法进行迭代,还是JUnit4提供这种检查? 编辑: 由于注释不能包含代码,因此我根据以下答案放置了代码: 问题答案: 使用内置的JUnit 4类 org.junit.runners.model.FrameworkMethod 来检查方法。

  • 问题内容: 我想知道是否有可能检测浏览器是否在iOS上运行,这与使用Modernizr进行功能检测的方式类似(尽管这显然是设备检测而非功能检测)。 通常,我宁愿使用功能检测,但我需要根据该问题确定设备是否为iOS,因为它们处理视频的方式YouTube API无法在iPad / iPhone/非Flash设备上使用 问题答案: 我不喜欢User Agent嗅探,但是这是你的处理方式: 另一种方法是依

  • 问题内容: 我有一个非常简单和标准的PHP强制下载脚本。 我如何检查是否/何时完成下载以便在客户端通知用户?我什至不需要实时显示进度,我只对非常具体的事件感兴趣:“下载完成时”。根据我的研究,由于没有事件,因此似乎必须从服务器端确定它,而且我认为不可能拦截浏览器事件。 因此,似乎最好的选择是通过某种客户端/服务器端交互比较发送到总字节的字节。我该如何检查从服务器发送的字节以进行PHP强制下载?是否