Reflection API для Scala - PullRequest
       7

Reflection API для Scala

12 голосов
/ 05 февраля 2010

Кто-нибудь знает состояние полнофункционального API отражения для Scala?

Я знаю, что вы можете использовать API отражения Java для выполнения простых задач, но это не очень хорошо работает с языковыми функциями Scala. Я нашел интересную статью , описывающую экспериментальный API Scala Mirroring, но насколько я знаю, он все еще экспериментален. Я также нашел упоминание о ScalaSigParser, но, похоже, это довольно низкий уровень.

Это больше любопытство, чем что-либо еще, так как я сейчас просто играюсь со Scala. Я подумал, что ответ на этот вопрос может быть полезен и другим, интересующимся Scala.

1 Ответ

6 голосов
/ 05 февраля 2010

«Неизменяемая замена шаблона стиля JavaBean» может быть выражена именованными параметрами и, необязательно, аннотацией @BeanProperty:

import reflect._
case class A(@BeanProperty val x: String, @BeanProperty val y : Int)

A(x = "s", y = 3)
A(y = 3, x = "s")

Добавление методов (точнее: определение нового интерфейса) имеет смысл только в языке со статической типизацией, если клиент знает о новых методах и может компилироваться с интерфейсом. С помощью структурной типизации клиенты могут определять методы, которые они ожидают представить в объекте. Компилятор Scala преобразует структурный тип в код отражения, который может не работать во время выполнения.

type T = {def go(x : Int): Int }
def y(any : Any) = any.asInstanceOf[T].go(2)

class A{
  def go(x : Int) = x + 1
}
y(new A())
y(new {}) //this will fail

Вы можете определить новые классы или черты с помощью интерпретатора на лету. Метод Interpret преобразует код Scala в байт-код.

Вы уже упомянули ScalaSigParser , с которым не совсем легко работать.

Я думаю, что остальные функции, которые вам нравятся, еще не созданы.

...