Is there a way to reference the Java class for a Kotlin top-level function?

后端 未结 5 1047

I want to load a resource in a top level function using Class.getResourceAsStream().

Is there any way to get a reference to the class that the top level

相关标签:
5条回答
  • 2020-11-29 09:44

    In the absence of a way to get a reference directly, I've fallen back on creating an anonymous object in the current package

    val myThing = object: Any() {}.javaClass.getResourceAsStream(...)
    
    0 讨论(0)
  • 2020-11-29 09:47

    No, there is no syntax to reference that class. You can access it using Class.forName(). For example, if the file is called "Hello.kt" and is located in the package "demo", you can obtain the class by calling Class.forName("demo.HelloKt").

    0 讨论(0)
  • 2020-11-29 09:50

    As linters like detekt would flag anonymous classes as EmptyClassBlock you could also use something like

    internal object Resources
    
    fun resourceStream(name: String): InputStream {
        return Resources.javaClass.getResourceAsStream(name)
    }
    
    0 讨论(0)
  • 2020-11-29 09:55

    With Java 7 you can get a reference to the current Java class from a top level function using

    MethodHandles.lookup().lookupClass()
    
    0 讨论(0)
  • 2020-11-29 10:03

    Another way I found is to declare a local class or an anonymous object inside a top level function and to get its enclosingClass:

    val topLevelClass = object : Any() {}.javaClass.enclosingClass
    

    Note: to work, this declaration should be placed on top level or inside a top-level function.

    Then you can use the topLevelClass as a Class<out Any>:

    fun main(args: Array<String>) {
        println(topLevelClass) // class MyFileNameKt
    }
    
    0 讨论(0)
提交回复
热议问题