Pergunta

Quando trabalhando com as classes java muitas vezes eu recebo reflexão avisos se eu fiz algo errado, por exemplo,

IllegalArgumentException Não há campo correspondente encontrado:fica para a classe o java.lang.Cadeia clojure.lang.Refletor.getInstanceField (Refletor.java:271)

É clojure fazendo uma reflexão em tempo de execução para cada invocação de um determinado métodos?ou é armazenadas em cache, em qualquer tipo de forma?Haveria um benefício de velocidade para mover qualquer tipo de envolvimento do java-interoperabilidade em um relacionado classe java?

Foi útil?

Solução

Clojure vai fazer a reflexão em tempo de execução só se não pode-se inferir que o método exacto para chamada com base no contexto que a cerca, caso contrário, ele emite o código que irá chamar o método diretamente.Você pode usar dicas de tipo para fornecer o compilador com este contexto, se necessário.Por exemplo:

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"

A primeira função use a reflexão, cada vez que é chamado;o segundo tem desempenho similar a nativo de código Java.

Outras dicas

Que não é uma reflexão aviso, é apenas uma indicação de que ele estava usando reflexão.

Você pode usar dicas de tipo para eliminar a reflexão.O *warn-on-reflection* bandeira, como descrito no link acima (padrão false), opcionalmente permite a reflexão avisos.

Acho que é conveniente a utilização de Leiningen do lein check utilitário, que tenta compilar todos os Clojure arquivo no seu projeto, com a reflexão avisos ativado.Isto irá relatório de reflexão problemas no seu código, ou em qualquer código carregado a partir de bibliotecas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top