gpt4 book ai didi

kotlin - 检测kapt中的单例

转载 作者:行者123 更新时间:2023-12-02 12:54:40 26 4
gpt4 key购买 nike

我正在为Kotlin写一个注释处理器,它需要知道如何调用方法,即是否需要构造一个类。

以下代码适用于Java代码,值和@JvmStatic标记的代码,但不适用于Kotlin object Foo {}单例:

import javax.lang.model.element.Element
import javax.lang.model.element.Modifier

// Fails if el is in a singleton
fun isStatic(el: Element) = el.modifiers.contains(Modifier.STATIC)

检测是否可以在不构造类的情况下调用方法的最佳方法是什么?

最佳答案

这不是一个完美的解决方案,但这就是我想出的。它检查二进制数据中的kotlin.Metadata,以查看它是否是Kotlin类,然后使用试探法来弄清它是否是静态的。

如果要查找主文件,即可以从命令行运行的文件,则需要类似的技术。

fun isKotlinClass(el: TypeElement)
= el.annotationMirrors.any { it.annotationType.toString() == "kotlin.Metadata" }

/** Check for Java static or Kotlin singleton.
* An imperfect heuristic: if not static, checks for a static INSTANCE field. */
private fun isStatic(element: Element): Boolean {
if (element.modifiers.contains(Modifier.STATIC)) return true
else {
val parent = element.enclosingElement
if (parent is TypeElement && isKotlinClass(parent)) {
val instances = parent.enclosedElements
.filter { "INSTANCE" == it.simpleName.toString() }
.filter { it.modifiers.contains(Modifier.STATIC) }
.filter { it.kind.isField }
return instances.isNotEmpty()
}
return false
}
}

关于kotlin - 检测kapt中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49524715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com