clojure.lang.Reflector如何在interop方法的实现中使用

时间:2014-01-02 05:46:48

标签: reflection clojure

当我们跑步时

(.someMethod obj arg1 arg2 arg3)

是一直使用的clojure.lang.Reflector类,它如何影响性能?

1 个答案:

答案 0 :(得分:4)

这取决于编译器是否可以静态地确定哪个类或接口someMethod属于。

如果可以,那么它将发出直接调用,并且c.l.Reflector将不会在运行时使用。结果相当于

((Foo) obj).someMethod(arg1, arg2, arg3);

在Java中,假设类/接口someMethod已声明Foo

如果不能,那么它将发出对静态方法clojure.lang.Reflector.invokeInstanceMethod的调用。在Clojure表示法中,可以写出发出的调用

(clojure.lang.Reflector/invokeInstanceMethod
  obj "someMethod" (object-array [arg1 arg2 arg3]))

这通过在运行时使用反射来查找匹配方法。相对于静态解决的呼叫而言,放缓速度非常惊人。