2016-01-22 15 views

risposta

5

un altro modo che ho trovato è quello di dichiarare una classe locale o un oggetto anonimo all'interno di una funzione di alto livello e per ottenere il suo enclosingClass:

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

Nota: per funzionare, questa dichiarazione deve essere posizionata al livello superiore o all'interno di una funzione di livello superiore.

quindi è possibile utilizzare il topLevelClass come Class<out Any>:

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

Esistono vantaggi rispetto a questo solo ottenendo la classe dell'oggetto anonimo? –

+1

Per quanto riguarda il caricamento delle risorse, no, non c'è. Ma questo è in realtà il modo per ottenere la riflessione della classe di alto livello, che potrebbe essere necessaria oltre alle risorse. – hotkey

10

No, non v'è alcuna sintassi per fare riferimento a quella classe. È possibile accedervi utilizzando Class.forName(). Ad esempio, se il file è chiamato "Hello.kt" e si trova nel pacchetto "demo", è possibile ottenere la classe chiamando Class.forName("demo.HelloKt").

5

In assenza di un modo per ottenere direttamente un riferimento, sono caduto di nuovo sulla creazione di un oggetto anonimo nel pacchetto corrente

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

Come Linters come detekt farebbe bandiera classi anonime come EmptyClassBlock si potrebbe anche usare qualcosa come

internal object Resources 

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

Con Java 7 è possibile ottenere un riferimento alla classe Java corrente da una funzione di primo livello usando

MethodHandles.lookup().lookupClass() 
+0

Questa è una domanda su Kotlin –

+0

Questo è un codice Kotlin valido. Puoi chiamare Java da Kotlin. Questo è il motivo per cui ho citato le funzioni di livello superiore (Kotlin) di cui tratta questa domanda. – hunterwb

+0

Sì, sei corretto. Sfortunatamente SO non mi lascerà sospendere a meno che non venga effettuata una modifica. –

Problemi correlati