这是我看到的一个非常简单的例子:
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>
变量“d”是Java“Date”实例,“m”是“Date”类的Java“Method”对象的数组。但是,当我尝试在其中一个“方法”实例上调用getName()
时,它不起作用。请注意,在“Date”实例上调用getTime()
可以正常工作,几乎所有其他对Java对象的调用都可以。 (好吧,我当然没有进行详尽的探索,但它通常有效,这就是为什么“方法”看起来很奇怪。)
如果我(在Java端)编写一个基本上包装“Method”和委托的类,那么工作正常。所以它并不像Javascript域和“Method”提供的东西之间存在一些内在的障碍。 (实际上,我认为脚本层本身必须进行反射,以便首先提供基本功能。)
我记得上次我通过JDK 6脚本框架愚弄Rhino时遇到并破解了这个问题。我不记得我是否弄清楚它为什么会发生。有人知道吗?
答案 0 :(得分:1)
Method.invoke
来调用这些方法,则invoke
的调用方将被视为直接调用方。这些方法列在当前Java Secure Coding Guidelines的第6部分中。