Ответ 1
Собственно, Scala имеет аннотации, сохраненные во время выполнения. Разница в том, что они не хранятся в виде аннотаций Java, а кодируются внутри содержимого двоичной ScalaSignature
аннотации (которая сама по себе является аннотацией Java, сохраненной во время выполнения).
Итак, аннотации Scala можно получить во время выполнения, но вместо использования отражения Java необходимо использовать Scala отражение:
class Awesome extends StaticAnnotation
@Awesome
class AwesomeClass
import scala.reflect.runtime.universe._
val clazz = classOf[AwesomeClass]
val mirror = runtimeMirror(clazz.getClassLoader)
val symbol = mirror.classSymbol(clazz)
println(symbol.annotations) // prints 'List(Awesome)'
К сожалению, отражение Scala по-прежнему отмечено как экспериментальное и на данный момент неустойчиво (SI-6240 или SI-6826 являются примерами довольно серьезных проблем). Тем не менее, это кажется наиболее простой заменой для отражения Java и аннотаций в долгосрочной перспективе.
На данный момент нужно использовать аннотации Java, которые, по моему мнению, по-прежнему являются хорошим решением.
В отношении фреймворков и библиотек для DI/ORM/WS/сериализации - Scala по-прежнему не кажется зрелым в этой области, по крайней мере, не в Java. Есть много текущих проектов, направленных на решение этих проблем, некоторые из них уже очень хороши, другие все еще находятся в разработке. Чтобы назвать некоторые из них, которые приходят мне на ум: Squeryl, Slick, Spray, Pickling.
Кроме того, Scala имеет некоторые дополнительные функции, которые часто делают аннотации ненужными. В качестве примера можно привести Typeclasses (реализованные с неявными параметрами).