当我们跑步时
(.someMethod obj arg1 arg2 arg3)
是一直使用的clojure.lang.Reflector类,它如何影响性能?
答案 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]))
这通过在运行时使用反射来查找匹配方法。相对于静态解决的呼叫而言,放缓速度非常惊人。