2010-02-04 18 views
12

Qualcuno conosce lo stato di un'API di riflessione con funzionalità complete per Scala?API Reflection per Scala

So che è possibile utilizzare l'API di riflessione di Java per fare cose semplici ma questo non funziona bene con le funzionalità linguistiche di Scala. Ho trovato un interesting article che descrive un'API Scala Mirroring sperimentale, ma per quanto ne so questo è ancora sperimentale. Ho anche trovato menzione di ScalaSigParser, ma questo sembra essere piuttosto di basso livello.

Questa è più una curiosità che altro dato che al momento sto solo giocando con Scala. Ho pensato che la risposta a questa domanda potrebbe essere utile anche per gli altri interessati a Scala.

+0

Puoi essere più specifico su ciò che vuoi fare una riflessione? Puoi usare le routine in scala.tools.nsc per aiutare con il manomissione del nome, e alcune cose semplicemente non riflettono bene - hai davvero bisogno della compilazione per aiutarti perché non si tratta solo di chiamare i metodi esistenti (per esempio se hai bisogno di una nuova chiusura). –

+0

In primo luogo, stavo pensando che sarebbe stato carino creare istanze di classi con parametri denominati in modo tale che non ci si debba preoccupare dell'ordine dei parametri - potrebbe essere una sostituzione immutabile per il modello di stile JavaBean. Stavo anche pensando che sarebbe stato bello poter osservare la struttura di una classe per quanto riguarda le funzionalità di Scala. vale a dire. prendi tutti i medici - trova quello primario - chiamalo. O rispondere a domande come è questo campo un val o var. Inoltre sarebbe bello usare una reflection API fatta in stile Scala idiomatico piuttosto che ricorrere all'API Java. Solo idee .. –

+0

Non stavo pensando ad alcune delle caratteristiche di metaprogrammazione più dinamiche come l'aggiunta di metodi in runtime o dichiarazioni di stile eval - solo più sulla falsariga di ciò che l'API di reflection Java ti permette di fare ma adattato al linguaggio di Scala. –

risposta

6

Il "sostituzione immutabile per il modello di stile JavaBean" può essere espresso parametri denominati e facoltativamente l'annotazione @BeanProperty:

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

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

metodi Aggiunta (più precisa: definire una nuova interfaccia) senso solo in un modo statico lingua digitata se il client conosce i nuovi metodi e può compilare l'interfaccia. Con la tipizzazione strutturale i client possono definire i metodi che si aspettano di essere presenti in un oggetto. Il compilatore Scala trasformerà il tipo strutturale in codice di riflessione che potrebbe fallire in fase di esecuzione.

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 

È possibile definire nuove classi o tratti con il interpreter al volo. Il metodo Interpret trasforma il codice Scala in codice byte.

Hai già menzionato lo ScalaSigParser che non è esattamente facile da utilizzare.

Penso che il resto delle funzionalità che ti piace non ci siano ancora.

+0

Questo fallisce in fase di esecuzione a causa della trasmissione, non a causa di tipi strutturali. –

Problemi correlati