Pregunta

Cuando trabajo con clases de Java existentes, a menudo recibo advertencias de reflexión si he hecho algo incorrecto, p.

IllegalArgumentException No se encontró ningún campo coincidente:Obtiene la clase java.lang.string clojure.lang.reflector.getinstancefield (reflector.java:271)

¿Clojure está reflexionando en tiempo de ejecución para cada invocación de los métodos dados?¿O está almacenado en caché de alguna manera?¿Habría un beneficio de velocidad al mover cualquier tipo de interoperabilidad de Java involucrada a una clase de Java relacionada?

¿Fue útil?

Solución

Clojure hará reflexión en tiempo de ejecución solo si no puede inferir el método exacto para llamar en función del contexto circundante, de lo contrario, emite un código que llamará directamente al método.Puede usar tips de tipo para proporcionar al compilador este contexto si es necesario.Por ejemplo:

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 primera función usará la reflexión cada vez que se invoca;El segundo tiene un rendimiento similar al código de Java nativo.

Otros consejos

Esa no es una advertencia de reflexión, es solo una indicación de que estaba usando reflexión.

Puedes usar escriba sugerencias para eliminar el reflejo.El *warn-on-reflection* marca como se describe en el enlace anterior (falso predeterminado), opcionalmente habilita advertencias de reflexión.

Me parece conveniente utilizar el de Leiningen. lein check utilidad, que intenta compilar todos los archivos Clojure en su proyecto, con las advertencias de reflexión activadas.Esto informará problemas de reflexión en su código o en cualquier código cargado desde bibliotecas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top