2010-02-15 57 views

回答

12

說明從http://clojure.org/java_interop

user> (macroexpand '(.PI Math)) 
(. (clojure.core/identity Math) PI) 

(identity Math)返回表示MathClass對象。您嘗試訪問此Class對象中名爲PI的實例成員,但它不存在。 (這與在Math類中訪問一個名爲PI的靜態成員不同)。您只會使用此對象進行反射,或者將Class作爲Object傳遞給其他方法或其他類型的東西。

user> (class (identity Math)) 
java.lang.Class 
user> (.getName (identity Math)) 
"java.lang.Math" 
user> (.getName Math) 
"java.lang.Math" 
user> (.getMethods Math) 
#<Method[] [Ljava.lang.reflect.Method;@12344e8> 
user> (vec (.getMethods Math)) 
[#<Method public static int java.lang.Math.abs(int)> #<Method public static long java.lang.Math.abs(long)> #<Method public static float java.lang.Math.abs(float)> ...] 
user> (.getField Math "PI") 
#<Field public static final double java.lang.Math.PI> 
user> (.getDouble (.getField Math "PI") Math) 
3.141592653589793 

做你想做的事情的最短路線可能是Math/PI

user> (macroexpand '(Math/PI)) 
(. Math PI) 
user> Math/PI 
3.141592653589793 
user> (. Math PI) 
3.141592653589793