2016-01-22 12 views

Odpowiedz

5

Innym sposobem znalazłem się zadeklarować lokalną klasę lub anonimowy obiekt wewnątrz funkcji najwyższego poziomu i uzyskać jego enclosingClass:

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

Uwaga: do pracy ta deklaracja powinna znajdować się na najwyższym poziomie lub w funkcji najwyższego poziomu.

Następnie można użyć topLevelClass jako Class<out Any>:

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

Czy istnieją korzyści z tego powodu po prostu uzyskanie klasy anonimowego obiektu? –

+1

Jeśli chodzi o ładowanie zasobów, nie, nie ma. Jest to jednak sposób na uzyskanie najwyższej klasy refleksji klasowej, której można potrzebować oprócz zasobów. – hotkey

10

Nie, nie ma składnia odwołać tej klasy. Możesz uzyskać do niego dostęp za pomocą Class.forName(). Na przykład, jeśli plik nazywa się "Hello.kt" i znajduje się w pakiecie "demo", możesz uzyskać klasę dzwoniąc pod numer Class.forName("demo.HelloKt").

5

W przypadku braku sposób, aby uzyskać odwołanie bezpośrednio, ja spadł z powrotem na tworzeniu anonimowy obiekt w obecnym pakiecie

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

As lintersu jak detekt by flagi klas anonimowych jako EmptyClassBlock Można też używać czegoś podobnego

internal object Resources 

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

Z Java 7 można uzyskać odniesienie do bieżącej klasy Java z funkcji najwyższego poziomu przy użyciu

MethodHandles.lookup().lookupClass() 
+0

To jest pytanie o Kotlin –

+0

To jest prawidłowy kod Kotlin. Możesz zadzwonić do Javy z firmy Kotlin. Dlatego wspomniałem o funkcjach najwyższego poziomu (Kotlin), o to właśnie chodzi. – hunterwb

+0

Tak, masz rację. Niestety SO nie pozwala mi zrobić tego, dopóki nie zostanie wprowadzona zmiana. –

Powiązane problemy