2016-04-23 20 views
9

Chcę się dowiedzieć, jakie dane przechowywane są w adnotacjach MetaData dodanych do każdej klasy Kotlin.Czy format danych przechowywanych w kotlin.MetaData jest udokumentowany w dowolnym miejscu?

Ale większość pola nie dają więcej szczegółów niż

„metadane w formacie niestandardowym. Format może być różny (lub nawet nieobecny) dla różnych rodzajów.”

https://github.com/JetBrains/kotlin/blob/master/core/runtime.jvm/src/kotlin/Metadata.kt

Czy istnieje odniesienie gdzieś, który wyjaśnia, jak interpretować te dane?

+5

'Metadane' przechowuje wszystkie informacje jako zakodowane protobuf. Jego schemat można znaleźć w [oficjalnym repozytorium] (https://github.com/JetBrains/kotlin/blob/ee50aec7342ab375a105bb318e6501135e859028/core/deserialization/src/descriptors.proto). Nie ma oficjalnego API do czytania tych informacji w tej chwili, ale wciąż jest dostępny za pomocą [wewnętrznych API] (https://gist.github.com/nsk-mironov/8c9c3092e9844233cdbb). –

+1

@ Vladimir Mironov co z pełną odpowiedzią zamiast komentarza? Ponieważ masz rację, Afaiku. – IRus

+0

@irus Wolę poczekać na odpowiedź od [Alexander Udalov] (http://stackoverflow.com/users/288456/alexander-udalov) –

Odpowiedz

8

kotlin.Metadata zawiera informacje na temat symboli Kotlin, takie jak ich nazwy, podpisy, relacji między typami itp Niektóre z tych informacji jest już obecny w podpisach JVM w plikach klasowych, ale wiele nie ma, ponieważ nie dość kilka rzeczy specyficznych dla Kotlin, których pliki klas JVM nie mogą poprawnie reprezentować: typ zerowalność, zmienne/tylko do odczytu interfejsy kolekcji, wariancja deklaracji witryny i inne.

Nie podjęto żadnych konkretnych działań, aby schemat danych zakodowanych w tej adnotacji był jawny, ponieważ dla większości użytkowników takie dane są potrzebne do introspekcji programu w środowisku wykonawczym, a Kotlin reflection library zapewnia do tego miły interfejs API.

Jeśli chcesz sprawdzić rzeczy specyficzne dla Kotlina, które nie są odsłonięte za pomocą interfejsu API do odczytywania, lub po prostu jesteś ciekawy, co jeszcze jest zapisane w tej adnotacji, możesz zapoznać się z implementacją kotlinx.reflect.lite. Jest to lekka biblioteka, której rdzeniem jest parser schematu generowany przez protobuf. Obecnie nie ma tam zbyt wiele obsługiwanych programów, ale dostępne są schemas , których można użyć do odczytania innych potrzebnych danych.

Powiązane problemy