Is there a way to reference the Java class for a K

2019-08-25 01:57发布

问题:

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 function will be compiled into so that I can write, for example

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

回答1:

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
}


回答2:

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").



回答3:

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(...)


回答4:

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

MethodHandles.lookup().lookupClass()


回答5:

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)
}


标签: java kotlin