Что такое подпись Scala?
При декомпиляции файлов Scala в код Java часто встречаются классы, помеченные ScalaSignature
s. Кажется, они имеют только одно значение аннотации, несколько закодированную строку. Почему компилятор Scala создает такую странную конструкцию вместо использования пользовательских Attribute
в class
файл?
1 ответ
Из хранилища маринованных подписей Scala в файлах классов:
Устаревший метод хранения подписей в качестве атрибутов одновременно более элегантен, более компактен (около 15%) и проще, чем при использовании аннотаций. Однако для доступа к выбранной подписи в атрибутах требуется получить и проанализировать весь файл класса. Поскольку аннотации распознаются JVM, новый метод позволяет извлекать протравленные байты сигнатуры непосредственно из работающей программы Scala с использованием отражения Java.
Новый метод является частью постоянной разработки для написания хорошей библиотеки отражений Scala. Отражение Java рассматривает программы Scala в упрощенном Java-ориентированном виде. Чтобы предоставить Scala-ориентированное представление отраженной программы, информация, предоставляемая Java-отражением, должна быть дополнена информацией, найденной в сигнатурах Scala. Унаследованный метод хранения потребовал бы повторного анализа всех файлов классов - JVM уже проанализировала их и выставляет большую часть их содержимого путем отражения. Новый метод хранения позволяет получить доступ к засоленным сигнатурам Scala так же, как и к другой отражающей информации, что делает новую библиотеку отражений Scala проще и быстрее.
Хотя библиотека отражений Scala не будет частью выпуска 2.8, желательно, чтобы существующие файлы классов 2.8 были совместимы с новой библиотекой отражений, когда она станет доступной. Кроме того, поскольку файлы классов 2.8 несовместимы с файлами 2.7 в любом случае, изменение метода хранения подписей в 2.8 не потребует вскоре другого изменения формата файла, несовместимого с двоичными данными.