1

这是我所看到的一个非常简单的示例:

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()其中一个“方法”实例时,它不起作用。请注意,调用getTime()“日期”实例可以正常工作,几乎所有其他对 Java 对象的调用也是如此。(好吧,我当然没有进行详尽的探索,但它通常是有效的,这就是为什么“方法”看起来很奇怪。)

如果我(在 Java 端)编写一个基本上包装“方法”和委托的类,那效果很好。因此,在 Javascript 域和“方法”提供的东西之间并不存在某种内在障碍。(实际上,我认为脚本层本身必须进行反射以首先提供基本设施。)

我记得上次我通过 JDK 6 脚本框架玩弄 Rhino 时遇到并解决了这个问题。我不记得我是否弄清楚它为什么会发生。有人知道吗?

4

1 回答 1

1

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

于 2010-07-06T13:25:31.987 回答