Frage

Wenn ich mit vorhandenen Java-Klassen arbeite, erhalte ich häufig Reflexionswarnungen, wenn ich etwas falsch gemacht habe, z. B.

IllegalArgumentException Kein passendes Feld gefunden:Gilt für die Klasse java.lang.string clojure.lang.reflector.getInstancefield (Reflector.java:271)

Führt Clojure zur Laufzeit für jeden Aufruf der angegebenen Methoden eine Reflexion durch?oder ist das irgendwie zwischengespeichert?Würde es einen Geschwindigkeitsvorteil geben, wenn man irgendeine Art von beteiligtem Java-Interop in eine verwandte Java-Klasse verschiebt?

War es hilfreich?

Lösung

clojure spiegelt nicht zur Laufzeitreflexion, wenn es nicht die genaue Methode zur Anrufe basierend auf dem umgebenden Kontext nicht ableiten kann. Andernfalls gibt er den Code aus, der das Verfahren direkt anruft.Sie können Typ Hinweise verwenden, um den Compiler bei Bedarf mit diesem Kontext bereitzustellen.Zum Beispiel:

generasacodicetagpre.

Die erste Funktion verwendet jedes Mal, wenn er aufgerufen wird;Der zweite hat eine ähnliche Leistung mit nativem Java-Code.

Andere Tipps

Das ist keine Reflexionswarnung, sondern nur ein Hinweis darauf, dass Reflexion verwendet wurde.

Sie können verwenden Geben Sie Hinweise ein Reflexion zu beseitigen.Der *warn-on-reflection* Flag wie im obigen Link beschrieben (Standardeinstellung: false), aktiviert optional Reflexionswarnungen.

Ich finde es praktisch, Leiningen zu verwenden lein check Dienstprogramm, das versucht, jede Clojure-Datei in Ihrem Projekt mit aktivierten Reflexionswarnungen zu kompilieren.Dadurch werden Reflexionsprobleme in Ihrem Code oder in jedem aus Bibliotheken geladenen Code gemeldet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top