Java中的Clojure,评估问题

Aru*_*n R 3 clojure

是否有关于评估以下REPL的结果的详细解释.

(.PI Math)
Run Code Online (Sandbox Code Playgroud)

IllegalArgument Exception
Run Code Online (Sandbox Code Playgroud)

(. Math PI)
Run Code Online (Sandbox Code Playgroud)

评估为

3.141592653589793
Run Code Online (Sandbox Code Playgroud)

Bri*_*per 12

解释在http://clojure.org/java_interop.

user> (macroexpand '(.PI Math))
(. (clojure.core/identity Math) PI)
Run Code Online (Sandbox Code Playgroud)

(identity Math)返回Class表示Math类的对象.您正在尝试访问PIClass对象中调用的实例成员,但它不存在.(这是从访问称为静态成员不同PIMath类).你永远只能用这个Class对象进行反思,或者是传递一个类的其他方法为对象,还是那些各种各样的东西.

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
Run Code Online (Sandbox Code Playgroud)

做你想做的最短路可能就是Math/PI.

user> (macroexpand '(Math/PI))
(. Math PI)
user> Math/PI
3.141592653589793
user> (. Math PI)
3.141592653589793
Run Code Online (Sandbox Code Playgroud)