これが私が見たものの非常に簡単な例です:
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" オブジェクトの配列です。ただし、「メソッド」インスタンスの 1 つを呼び出そうとするとgetName()
、機能しません。getTime()
「Date」インスタンスの呼び出しは、Java オブジェクトに対する他のほとんどすべての呼び出しと同様に、正常に機能することに注意してください。(もちろん、私は徹底的な調査を行ったわけではありませんが、一般的にはうまくいきます。そのため、「方法」は奇妙に思えます。)
基本的に「メソッド」とデリゲートをラップするクラスを(Java側で)書くと、うまくいきます。したがって、Javascript ドメインと「メソッド」が提供するものとの間に本質的な障壁があるわけではありません。(確かに、そもそもスクリプト層自体が基本的な機能を提供するためにリフレクションを行う必要があると思います。)
前回、JDK 6 スクリプト フレームワークを介して Rhino をいじっていたときに、この問題に遭遇してハッキングしたことを思い出します。なぜそれが起こるのかを理解したかどうかは覚えていません。誰か知っていますか?