문제

기존 Java 클래스로 작업할 때 뭔가 잘못한 경우 반사 경고가 표시되는 경우가 많습니다.

IllegalArgumentException 일치하는 필드가 없습니다.클래스 java.lang.string clojure.lang.reflector.getInstancefield (reflector.java:271)

Clojure는 주어진 메소드를 호출할 때마다 런타임에 반사를 수행합니까?아니면 어떤 방식으로든 캐시되어 있나요?관련된 Java-interop을 관련 Java 클래스로 이동하면 속도상의 이점이 있습니까?

도움이 되었습니까?

해결책

Clojure는 주변 컨텍스트를 기반으로 호출 할 정확한 방법을 추론 할 수없는 경우에만 런타임에 런타임에 반영을 수행합니다. 그렇지 않으면 메서드를 직접 호출하는 코드를 방출합니다.필요한 경우 유형 힌트를 사용하여 컴파일러를이 컨텍스트로 제공 할 수 있습니다.예를 들어 :

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"
.

첫 번째 기능은 호출 될 때마다 반영을 사용합니다.두 번째는 기본 Java 코드와 유사한 성능을 가지고 있습니다.

다른 팁

이는 리플렉션 경고가 아니라 리플렉션을 사용하고 있다는 표시일 뿐입니다.

당신이 사용할 수있는 힌트 입력 반사를 없애기 위해.그만큼 *warn-on-reflection* 위 링크에 설명된 대로 플래그(기본값은 false)이며 선택적으로 반사 경고를 활성화합니다.

Leiningen's를 사용하는 것이 편리하다고 생각합니다. lein check 반사 경고가 켜진 상태에서 프로젝트의 모든 Clojure 파일을 컴파일하려고 시도하는 유틸리티입니다.그러면 코드 또는 라이브러리에서 로드된 코드의 리플렉션 문제가 보고됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top