【问题标题】:Is there a way to reference the Java class for a Kotlin top-level function?有没有办法为 Kotlin 顶级函数引用 Java 类?
【发布时间】:2016-01-22 16:49:54
【问题描述】:

我想使用 Class.getResourceAsStream() 在顶级函数中加载资源。

有没有什么方法可以获取对顶层函数将被编译成的类的引用,以便我可以编写,例如

val myThing = readFromStream(MYCLASS.getResourceAsStream(...))

【问题讨论】:

    标签: java kotlin


    【解决方案1】:

    我发现的另一种方法是在顶级函数中声明一个本地类或匿名对象并获取其enclosingClass

    val topLevelClass = object{}.javaClass.enclosingClass
    

    注意:要工作,这个声明应该放在顶层或顶层函数内。

    然后您可以将topLevelClass 用作Class<out Any>

    fun main(args: Array<String>) {
        println(topLevelClass) // class MyFileNameKt
    }
    

    【讨论】:

    • 与仅获取匿名对象的类相比,这样做有什么好处吗?
    • 关于加载资源,不,没有。但这实际上是获得顶级类反射的一种方式,除了资源之外可能还需要它。
    【解决方案2】:

    使用 Java 7,您可以使用

    从顶级函数获取对当前 Java 类的引用
    MethodHandles.lookup().lookupClass()
    

    【讨论】:

    • 这是一个关于 Kotlin 的问题
    • 是的,你是对的。不幸的是,除非进行编辑,否则我不会让我投票。
    • 赞成。匿名对象方法似乎是一种 hack。
    【解决方案3】:

    不,没有引用该类的语法。您可以使用 Class.forName() 访问它。例如,如果文件名为“Hello.kt”并且位于“demo”包中,则可以通过调用Class.forName("demo.HelloKt")获取该类。

    【讨论】:

      【解决方案4】:

      由于没有直接获取引用的方法,我只能在当前包中创建一个匿名对象

      val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
      

      【讨论】:

        【解决方案5】:

        detekt 这样的 linter 会将匿名类标记为 EmptyClassBlock 你也可以使用类似的东西

        internal object Resources
        
        fun resourceStream(name: String): InputStream {
            return Resources.javaClass.getResourceAsStream(name)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 2019-06-09
          • 2015-05-18
          相关资源
          最近更新 更多