2016-10-23 2 views
2

Clojure 함수에서 Java reflection 메서드를 사용하고 싶습니다. (.toString {:a 1}) 같은 코드는 clojure reader로 구문 분석하고 컴파일합니다. 그래서, clojure 매크로를 사용하여 작동합니다. 하지만 런타임에 자바 객체 메서드를 호출하는 함수를 정의하고자한다면 실패합니다. 나는 이런 종류의 코드를 클로저로 호출하는 방법을 모른다.실행시 java 메소드를 호출하기위한 clojure 코드를 생성하는 방법은 무엇입니까?

여기 내 데모 코드 : 결과 목록 (.toString 3.4M)입니다

(def jmethod ".toString") 
(defn call-java-method [mname & body] 
    (let [fn1 (fn [] `(~(symbol mname) [email protected]))] 
     (fn1))) 

user=> (call-java-method jmethod 3.4M) 

,하지만 난 Clojure의 함수 호출로이 목록을 평가 후면합니다.

답변

1

매크로는 '컴파일 타임에 작동합니다'때문에 매크로를 사용하여 동적으로 확인 된 메서드를 호출 할 수 없습니다.

당신은 두 가지 옵션이 있습니다 :
  1. 이 코드를 컴파일하는 런타임 컴파일러로 Clojure의를 사용하여 구성되어 자바 Reflection API
  2. 사용 clojure.core/eval를 사용을, 다음을 실행합니다.
관련 문제