2010-02-15 56 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