Question

Lorsque je travaille avec des classes Java existantes, je reçois souvent des avertissements de réflexion si j'ai fait quelque chose de mal, par ex.

IllegalArgumentException Aucun champ correspondant trouvé :Obtient pour la classe java.lang.string Clojure.lang.reflector.getInstanceField (Reflector.java:271)

Clojure effectue-t-il une réflexion au moment de l'exécution pour chaque invocation des méthodes données ?ou est-ce mis en cache d'une manière ou d'une autre ?Y aurait-il un avantage en termes de rapidité à déplacer tout type d'interopérabilité Java impliquée dans une classe Java associée ?

Était-ce utile?

La solution

CLOJURE fera une réflexion au moment de l'exécution uniquement s'il ne peut pas déduire la méthode exacte à appeler en fonction du contexte environnant, sinon il émet un code qui appellera la méthode directement.Vous pouvez utiliser des indications de type pour fournir au compilateur dans ce contexte si nécessaire.Par exemple:

user=> (set! *warn-on-reflection* true)

user=> (defn str-len [x] (.length x))
Reflection warning, NO_SOURCE_PATH:1:19 - reference to field length can't be resolved.

user=> (defn str-len-2 [^String x] (.length x))

user=> (str-len "abc") ; -> 3
user=> (str-len-2 "abc") ; -> 3

user=> (time (dotimes [_ 100000] (str-len "abc")))
"Elapsed time: 1581.163611 msecs"
user=> (time (dotimes [_ 100000] (str-len-2 "abc")))
"Elapsed time: 36.838201 msecs"

La première fonction utilisera la réflexion chaque fois qu'elle est invoquée;La seconde a une performance similaire au code Java natif.

Autres conseils

Ce n'est pas un avertissement de réflexion, c'est juste une indication qu'il utilisait la réflexion.

Vous pouvez utiliser tapez des indices pour éliminer la réflexion.Le *warn-on-reflection* flag comme décrit dans le lien ci-dessus (faux par défaut), active éventuellement les avertissements de réflexion.

Je trouve pratique d'utiliser celui de Leiningen lein check utilitaire, qui tente de compiler chaque fichier Clojure de votre projet, avec les avertissements de réflexion activés.Cela signalera les problèmes de réflexion dans votre code ou dans tout code chargé à partir de bibliothèques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top