Domanda

Quando si lavora con le classi Java esistenti, spesso ricevo avvertenze di riflessione se ho fatto qualcosa in modo errato, ad esempio.

.

IllegalArgumentException Nessun campo corrispondente trovato: ottiene per la lezione java.lang.String clojure.lang.reflector.getinStancefield. (Riflettore.java:271)

è il cloudo che fa la riflessione in runtime per ogni invocazione dei metodi dati?O è questo cache in qualsiasi tipo di modo?Ci sarebbe un vantaggio della velocità per spostare qualsiasi tipo di collegamento Java-interoperativo in una classe Java correlata?

È stato utile?

Soluzione

Clojure farà la riflessione in runtime solo se non può dedurre il metodo esatto da chiamare in base al contesto circostante, altrimenti emette il codice che chiamerà direttamente il metodo.È possibile utilizzare i suggerimenti di tipo per fornire il compilatore con questo contesto, se necessario.Ad esempio:

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 prima funzione userà la riflessione ogni volta che è invocato;Il secondo ha prestazioni simili al codice Java nativo.

Altri suggerimenti

Non è un avvertimento di riflessione, è solo un'indicazione che stava usando la riflessione.

Puoi usare Tipo suggerimenti per eliminare la riflessione.La bandiera *warn-on-reflection* come descritto nel link sopra (predefinito falso), abilita facoltativamente le avvertenze di riflessione.

Trovo conveniente utilizzare l'utilità lein check di Leiningen, che tenta di compilare ogni file cloudo nel tuo progetto, con le avvertenze di riflessione accese.Ciò riporterà i problemi di riflessione nel tuo codice o in qualsiasi codice caricato dalle librerie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top