Reflection clojure.lang.Reflector如何用于实现互操作方法
当我们跑的时候Reflection clojure.lang.Reflector如何用于实现互操作方法,reflection,clojure,Reflection,Clojure,当我们跑的时候 (.someMethod obj arg1 arg2 arg3) clojure.lang.Reflector类是否一直在使用?这对性能有何影响?这取决于编译器是否能够静态确定someMethod属于哪个类或接口 如果可以,那么它将发出一个直接调用,c.l.Reflector将不会在运行时使用。结果相当于 ((Foo) obj).someMethod(arg1, arg2, arg3); 在Java中,假设类/接口Foo声明了someMethod 如果不能,那么它将发出对静态
(.someMethod obj arg1 arg2 arg3)
clojure.lang.Reflector类是否一直在使用?这对性能有何影响?这取决于编译器是否能够静态确定someMethod属于哪个类或接口 如果可以,那么它将发出一个直接调用,
c.l.Reflector
将不会在运行时使用。结果相当于
((Foo) obj).someMethod(arg1, arg2, arg3);
在Java中,假设类/接口Foo
声明了someMethod
如果不能,那么它将发出对静态方法clojure.lang.Reflector.invokeInstanceMethod
的调用。在Clojure表示法中,可以编写发出的调用
(clojure.lang.Reflector/invokeInstanceMethod
obj "someMethod" (object-array [arg1 arg2 arg3]))
这将通过在运行时使用反射来查找匹配方法。与静态解析调用相比,速度减慢是相当惊人的。编译器什么时候不能解析该方法?当它没有足够的关于
obj
类型的信息时。例如,如果obj
是函数的非类型暗示参数,则编译器无法确定运行时obj
可能是什么。事实上,该函数可能用于多种类型的对象,这些对象都有一个名为someMethod
的方法,但它们完全不相关。所有这些类型的集合甚至可能在运行时增长。