2010-02-04 2 views
12

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

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

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

+0

Можете ли вы уточнить, что вы хотите от отражения? Вы можете использовать процедуры в scala.tools.nsc, чтобы помочь с изменением имени, а некоторые вещи просто не отражают хорошо - вам действительно нужна компиляция, чтобы помочь вам, потому что это не просто вызов существующих методов (например, если вам нужно новое закрытие). –

+0

Во-первых, я думал, что было бы неплохо создать экземпляры классов с именованными параметрами, чтобы вам не пришлось беспокоиться о порядке параметров - это может быть неизменной заменой шаблону стиля JavaBean. Я также думал, что было бы неплохо иметь возможность взглянуть на структуру класса, поскольку она относится к функциям Scala. то есть. Принеси мне все харты - найди главное - назови это. Или ответьте на вопросы, например, это поле val или var. Кроме того, было бы неплохо использовать API отражения, выполненный в идиоматическом стиле Scala, вместо того, чтобы возвращаться к API Java. Просто идеи .. –

+0

Я не думал о некоторых более динамичных функциях метапрограммирования, таких как добавление методов во время исполнения или в выражениях стиля eval, - только по тому, что API-интерфейс отражения Java позволяет вам делать, но адаптирован для языка Scala. –

ответ

6

«неизменная замена для шаблона 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 

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

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

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

+0

Это не работает во время выполнения из-за литья, а не из-за структурных типов. –