타입 힌트는 반사가 여러 번 발생하는 실행 시간을 크게 향상시킬 수 있습니다. 형식 힌트에 대한 나의 이해는 컴파일러가 리플렉션 검색을 캐시 할 수있게한다는 것입니다. 해당 캐싱을 동적으로 수행 할 수 있습니까? 아니면 이것이 불가능하거나 불가능할 어떤 이유가 있습니까? Programming Clojure에서Clojure에서 자바 리플렉션을 메모 할 수 있습니까?
4
A
답변
6
는 :
장소 유형 힌트와이러한 경고는 Clojure에서이 C의 유형을 알 수있는 방법이 없다는 것을 나타냅니다. 당신은 메타 데이터를 구문
^Class
을 사용하여이 문제를 해결하는 타입 힌트를 제공 할 수
(defn describe-class [#^Class c]
{:name (.getName c)
:final (java.lang.reflect.Modifier/isFinal (.getModifiers c))})
, 반사 경고가 사라집니다. 컴파일 된 Clojure 코드는 컴파일 된 Java 코드와 정확히 동일합니다. 또한 describe-class를 클래스가 아닌 다른 것으로 호출하려는 시도는 ClassCastException과 함께 실패합니다.
요약하면 반사 캐스팅은 캐시되지 않고 제거됩니다.
3
리치 가르치 려 친절하게도했다 : ". JDK의 적절한에 대한 진짜 대답은 JSR 292, memoizaton보다 훨씬 더 나은 성능을 호출 사이트 캐시의 적절한 구성을 허용 invokedynamic
명령이다"
유형 힌트 작동 방식에 대한 잘못된 이해를 고치러와 주셔서 감사합니다. 캐시 반영에 대한 더 큰 의문점은 아직 답을 얻지 못했지만, 가능한 한 간단하지 않다는 의미가 있음을 인정할 것입니다. –