Verwenden von Scala-Reflektion mit Java-Reflektion

8

Ich habe viel Code, der Java Reflection verwendet, um beliebige benutzerdefinierte Methoden auf Java-Objekten als Teil einer DSL aufzurufen.

Allerdings sind viele dieser Java-Objekte in der Praxis Scala-Objekte, und einige der Methoden auf ihnen sind mit der Annotation Scala @deprecated gekennzeichnet. Leider kann der Annotationsmechanismus von Java Scala-Annotationen nicht sehen, und bis Scala 2.10 gab es keinen bequemen Weg (den ich kenne?), Um auf diese Annotationen zuzugreifen.

Ich habe endlich auf 2.10 aufgerüstet und würde gerne Depreciation Warnings von meinem DSL ausgeben. Ich möchte jedoch nicht den gesamten Evaluator umschreiben (zumindest jetzt), um Scala Reflection zu verwenden, also gibt es einen bequemen Weg, von einem java.lang.reflect.Method zu etwas zu gehen, mit dem ich Scala Reflektion nutzen kann, um herauszufinden, ob Scala-Methode in Frage ist veraltet? Oder muss ich eine Menge der vorhandenen Methodenauflösungslogik unter Verwendung der Scala-Reflexion duplizieren, bevor ich an diese Information gelangen kann?

Es sieht so aus, als ob eine JavaToScala -Klasse in der Scala-Reflexion existiert, die eine methodToScala -Methode enthält, die das getan hat, was ich will. Die einzige Spur, die ich finden kann, ist hier , in einem Google-Code-Projekt. Warum wurde die Funktionalität aus der Kernreflexion entfernt? Oder ist es immer noch unter einem anderen Namen?

Bearbeiten: Es sieht so aus, als ob der Code in scala.reflect.runtime.JavaMirrors weiterlebt, aber leider ist er privat (es gibt noch ein weiteres JavaMirrors , das Teil der öffentlichen API ist, aber nichts davon bietet.) I kann nicht für das Leben von mir herausfinden, wenn es einen "Weg" von Aufrufen durch eine öffentliche API gibt, der mich ganz hinunter zum privaten methodAsScala begraben tief in der privaten JavaMirrors bringt. Es ist frustrierend, um es gelinde auszudrücken: (

    
Mysterious Dan 29.03.2013, 22:01
quelle

1 Antwort

3

Hier ist eine schnelle Lösung (Dank an @EugeneBurmako)

Ссылка

Dafür wurde ein Problem eingereicht (Kredite an @MysteriousDan):

Ссылка

    
gzm0 02.05.2013, 23:01
quelle