2010-12-31 12 views
13

Sto lavorando su una libreria che ha bisogno di riflessione e necessita di informazioni specifiche su Scala rispetto a quanto è disponibile tramite l'API di riflessione Java standard. In questo momento sto usando il codice non documentato in scalap (equivalente a Scala a javap) e sto cercando di associare i dati forniti con gli oggetti di riflessione Java in modo che possa chiamare metodi e tale (scalap analizza solo i file di classe).C'è una buona libreria di riflessioni disponibile per Scala?

ho trovato questo, ma non c'è niente ... https://github.com/dubochet/scala-reflection

... e ho cercato il repo SVN Scala di tracce di essa e non è riuscito a trovare lì, sia (ma potrebbe essere io l'ho appena perso).

Qualcuno sa di una libreria di riflessione Scala che fornisce informazioni simili a ciò che fornisce scalap ma consente anche di chiamare metodi, campi di accesso, ecc. Come la libreria di riflessione Java?

[Edit]

Suppongo che a dovrebbe spiegare più chiaramente quello che sto cercando di fare ...

Voglio scrivere una libreria che avrà un file, ad esempio un file di testo delimitato o foglio di lavoro all'interno di un file Excel, con le intestazioni in alto e un Manifest, e restituisce un Seq di oggetti. Quindi, in pratica una funzione che assomiglia a questo:

def parseFile[T](fileName: String)(implicit manifest: Manifest[T]): Seq[T] = { 
    // lots of magic ... 
} 

Nel caso generale questo probabilmente non è possibile, e sono sicuro che ci sono un sacco di "possibili" casi che sono estremamente difficili, ma penso che c'è un sottogruppo utile che può essere implementato senza troppa complessità una volta capito il problema di scalap (o scala.reflect, i due sono simili ma diversi ...) e lo si sposa con gli oggetti giusti nell'API di Java reflection. Il mio piano di base è quello di esaminare le intestazioni del file, esaminare i nomi dei parametri e i tipi dei costruttori pubblici e applicare metodi sull'oggetto companion, scegliere quello che meglio corrisponde al file e analizzare il file in oggetti. Questo è per qualcosa di più vicino allo scripting rispetto alla creazione di applicazioni. Quindi per lo più sto solo cercando di costruire qualcosa che mi farà risparmiare tempo.

Quindi la libreria che sto scrivendo non ha né una conoscenza a priori delle classi che sta creando né di qualcosa oltre la struttura di base (delimitato testo tabellare, Excel, ecc.) Del file che sta usando. Preferibilmente dovrebbe essere minimamente invasivo.

Ho già fatto qualcosa di simile in Python, ma era invasivo nel fatto che dovevo usare descrittori che specificavano i tipi necessari, o avevo bisogno di fare in modo che i descrittori accettassero le stringhe e facevano la conversione al tipo appropriato . Immagino che con le ricche informazioni di Scala potrei essere meno invasivo.

+0

Le risposte alla mia domanda potrebbero essere utili: http: // stackoverflow.it/questions/1469958/scala-how-do-i-dynamically-instantiate-an-object-and-invoke-a-method-using-refle –

+0

Non avevo visto la tua domanda ma sfortunatamente non aiuta oltre l'aggiunta alla mia lista di riferimenti. –

+0

Hai considerato i tipi strutturali come mezzi di riflessione? – pedrofurla

risposta

14

È è possibile creare un manifest, in modo riflessivo, in fase di esecuzione.

Inserire il TypeWrangler here on gitub ...

Basta togliere thge ultimi due metodi di quella classe (che sono specifici per primavera), e siete pronti per partire!

Uno di questi giorni inserirò il codice in una libreria a riflessione completa, utilizzando anche la logica della firma in Scalap. Sembra che la domanda esista per qualcosa di simile.

+0

Grazie per il link, mi impegnerò sicuramente nella tradizione ormai onorata del riutilizzo di copia e incolla con alcuni di essi. –

+0

@erik - niente dice grazie piuttosto come un upvote :) –

+1

@KevinWright: è ancora così il 10 febbraio 14? –

Problemi correlati