2013-03-29 13 views
8

Ho un sacco di codice che utilizza la reflection Java per richiamare metodi arbitrari specificati dall'utente su oggetti Java, come parte di un DSL.Uso di Scala riflesso con riflessione Java

Tuttavia, molti di quegli oggetti Java, in pratica, sono oggetti Scala, e alcuni dei metodi su di essi sono contrassegnati con l'annotazione Scala @deprecated. Sfortunatamente, il meccanismo delle annotazioni di Java non può vedere le annotazioni di Scala, e fino a Scala 2.10 non c'era un modo conveniente (che io sappia?) Per avere accesso a quelle annotazioni.

Ho finalmente aggiornato a 2.10 e vorrei essere in grado di emettere avvisi di deprecazione dal mio DSL. Tuttavia, non voglio riscrivere l'intero programma di valutazione (almeno per ora) per usare il riflesso di Scala, quindi c'è un modo conveniente per passare da un java.lang.reflect.Method a qualcosa su cui posso usare il riflesso di Scala per capire se il metodo Scala in questione è deprecato? O dovrò duplicare un sacco della logica di risoluzione del metodo esistente usando Scala reflection prima di poter ottenere quelle informazioni?

Sembra una classe JavaToScala utilizzata per esistere in Scala reflection, che conteneva un metodo methodToScala che faceva ciò che desideravo. L'unica traccia che riesco a trovare è here, in un progetto di codice google. Perché la funzionalità è stata spostata dalla riflessione principale? O è ancora lì sotto un nome diverso?

Edit: Sembra che il codice in questione vive in scala.reflect.runtime.JavaMirrors, ma purtroppo è privato (c'è un altro JavaMirrors che fa parte del pubblico API, ma non fornisce alcuna di cosa ho bisogno.) Non posso capire per la vita di me se c'è un "percorso" di invocazioni attraverso una API pubblica che mi porta fino al privato methodAsScala sepolto in profondità nel privato JavaMirrors. E 'frustrante, per non dire altro :(

+1

siete già in profondità nella riflessione all'inferno, perché non chiamare metodo privato attraverso la riflessione così? non sarà peggiore del mal di testa durante il controllo per la compatibilità con le nuove versioni di Scala. –

+0

I Stavo davvero chiedendo se ci fosse un modo per farlo. Sembra che ci fosse, ma a un certo punto è stato spostato in terra privata. Inoltre, non sono sicuro di come chiamare questi metodi privati ​​poiché l'intera classe in cui si trovano è privata. Sarebbe divertente usare la riflessione per chiamare i metodi di riflessione però :) Sfortunatamente tutti i metodi sono in un tratto, e non sono sicuro di come ottenerne un'istanza, anche se potessi riflettere in che modo. Qualche indicazione? –

+1

Dovresti usare 'getDeclaredClasses()' per ottenere la classe privata –

risposta

Problemi correlati