Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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
为什么可以';java.lang.reflect.Method实例上的Javascript(在Rhino中运行)访问方法?_Java_Javascript_Rhino - Fatal编程技术网

为什么可以';java.lang.reflect.Method实例上的Javascript(在Rhino中运行)访问方法?

为什么可以';java.lang.reflect.Method实例上的Javascript(在Rhino中运行)访问方法?,java,javascript,rhino,Java,Javascript,Rhino,下面是我所看到的一个非常简单的例子: jrunscript -f - js> var d = new java.util.Date(); js> var m = d.getClass().getMethods(); js> println(m[0].getClass().getName()); java.lang.reflect.Method js> var name = m[0].getName(); script error: sun.org.mozilla.java

下面是我所看到的一个非常简单的例子:

jrunscript -f -
js> var d = new java.util.Date();
js> var m = d.getClass().getMethods();
js> println(m[0].getClass().getName());
java.lang.reflect.Method
js> var name = m[0].getName();
script error: sun.org.mozilla.javascript.internal.WrappedException: Wrapped java.lang.UnsupportedOperationException: invocation not supported (<STDIN>#1) in <STDIN> at line number 1
js> var time = d.getTime();
js> println(time);
1278421741768
js> 
jrunscript-f-
js>var d=new java.util.Date();
js>var m=d.getClass().getMethods();
js>println(m[0].getClass().getName());
java.lang.reflect.Method
js>var name=m[0].getName();
脚本错误:sun.org.mozilla.javascript.internal.WrappedException:Wrapped java.lang.UnsupportedOperationException:第1行不支持调用(#1)
js>var time=d.getTime();
js>println(时间);
1278421741768
js>
变量“d”是一个Java“Date”实例,“m”是“Date”类的Java“Method”对象数组。但是,当我尝试在一个“方法”实例上调用
getName()
时,它不起作用。请注意,在“Date”实例上调用
getTime()
效果很好,对Java对象的所有其他调用几乎都是如此。(当然,我还没有进行详尽的探索,但它通常是有效的,这就是为什么“方法”看起来很奇怪。)

如果我(在Java端)编写一个基本上包装了“方法”和委托的类,那就可以了。所以,Javascript域和“方法”提供的东西之间并没有本质上的障碍。(事实上,我认为脚本层本身首先必须进行反射以提供基本功能。)


我记得上一次我通过JDK 6脚本框架与Rhino鬼混时遇到并解决了这个问题。我不记得我是否知道为什么会这样。有人知道吗?

IIRC,这是因为许多方法使用直接调用方进行某些安全检查。如果使用
Method.invoke
调用这些方法,则
invoke
的调用者将被视为直接调用者。这些方法在当前IIRC的第6节中列出,这是因为许多方法使用直接调用方进行某些安全检查。如果使用
Method.invoke
调用这些方法,则
invoke
的调用者将被视为直接调用者。这些方法列在当前的第6节中。

这是一个非常有趣的参考,但(至少对我来说)不清楚这与我所看到的有直接关系。我目前没有使用任何安全管理器,而且我遇到的异常并不表示存在安全问题——这只是“不受支持的操作”。这是出于安全原因。没有理由让安全经理参与进来。事实上,无论是否有安全管理人员在场,相同的代码表现相同都是一个非常好的主意。这是一个非常有趣的参考,但(至少对我来说)不清楚这与我所看到的有直接关系。我目前没有使用任何安全管理器,而且我遇到的异常并不表示存在安全问题——这只是“不受支持的操作”。这是出于安全原因。没有理由让安全经理参与进来。事实上,无论是否有安全管理器在场,相同代码的行为都是一个非常好的主意。