2013-03-29 26 views
8

Ich habe eine Menge Code, der Java-Reflektion verwendet hat, um beliebige benutzerdefinierte Methoden auf Java-Objekten als Teil einer DSL aufzurufen.Verwenden von Scala-Reflektion mit Java-Reflektion

Viele dieser Java-Objekte sind jedoch in der Praxis Scala-Objekte, und einige der Methoden auf ihnen sind mit der Scala @deprecated Annotation markiert. Unglücklicherweise kann Javas Annotations-Mechanismus keine Scala-Annotationen 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 möchte Deprecation Warnungen von meinem DSL ausgeben können. Allerdings möchte ich nicht den gesamten Evaluator (zumindest jetzt) ​​umschreiben, um Scala-Reflektion zu verwenden, also gibt es einen bequemen Weg, von einer Scala-Reflektion auf etwas zu gehen, um herauszufinden, ob die 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 aus wie eine JavaToScala Klasse verwendet, um in Scala Reflexion existieren, die eine methodToScala Methode darin hatte, was tat, was ich will. Die einzige Spur, die ich finden kann, ist here, 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 aus wie der Code in Frage lebt in scala.reflect.runtime.JavaMirrors, aber leider ist es privat (es gibt eine andere JavaMirrors, die Teil der öffentlichen API ist, bietet aber nichts von dem, was ich brauche.) Ich kann nicht finde heraus für das Leben von mir, wenn es einen "Pfad" von Aufrufen durch eine öffentliche API gibt, der mich den ganzen Weg hinunter zu dem privaten methodAsScala begraben tief innerhalb des privaten JavaMirrors nimmt. Es ist frustrierend, gelinde gesagt :(

+1

Sie sind bereits tief in der Reflektion Hölle, warum nicht auch private Methode durch Reflexion aufrufen? Es wird nicht schlimmer von Ihren Kopfschmerzen bei der Überprüfung der Kompatibilität mit neuen Scala-Versionen sein. –

+0

I Ich habe mich wirklich gefragt, ob es einen bestätigten Weg dafür gibt. Es sieht so aus, als wäre es dort gewesen, aber irgendwann wurde es in privates Land verlegt. Ich bin mir auch nicht sicher, wie ich diese privaten Methoden aufrufen soll, da die gesamte Klasse, in der sie sich befinden, privat ist. Es wäre amüsant, Reflektion zu verwenden, um Reflektionsmethoden zu nennen :) Leider sind alle Methoden in einem Zug, und ich bin nicht sicher, wie ich eine Instanz davon bekommen würde, selbst wenn ich mich einarbeiten könnte. Irgendwelche Zeiger? –

+1

Sie müssten 'getDeclaredClasses()' verwenden, um private Klasse zu erhalten –

Antwort