Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection clojure.lang.Reflector如何用于实现互操作方法_Reflection_Clojure - Fatal编程技术网

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
的方法,但它们完全不相关。所有这些类型的集合甚至可能在运行时增长。