http://d.hatena.ne.jp/hoso-kawa/20060526#1148650000
へ〜、メモメモっと。
ってゆーか、Proxyを使わなくても
こんな感じで
public class MethodMissing extends ScriptableObject {private Function handler = null;
public MethodMissing(Function handler) {
this.handler = handler;
}public Object get(final String name, Scriptable o) {
return new BaseFunction() {
public Object call(Context cx, Scriptable scope, Scriptable f, Object args) {
Object new_args = new Object[1 + args.length];
new_args[0] = name;
System.arraycopy(args, 0, new_args, 1, args.length);
return handler.call(cx, scope, null, new_args);
}
};
}public String getClassName() {
return this.getClass().getName();
}}
こう呼び出して
var o = new MethodMissing(function() {
print("name:" + arguments[0]);for(var i=1; i
こうなる…と。
name:foo
name:bar
a
name:zoo
B
12
Proxyでmethod_missing
いろいろ手を考えてみる。
こんなクラスを定義して
public class Foo {public static Scriptable getJsObj() {
return (Scriptable) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class { Scriptable.class }, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object args) throws Throwable {
final String name = (String) args[0];return new BaseFunction() {
public Object call(Context cx, Scriptable scope, Scriptable self, Object args) {
System.out.println("name: " + name);
System.out.println("args: " + Arrays.asList(args));
return null;
}
};
}
});
}}
スクリプトからこう呼び出す。
var o = Foo.getJsObj();
o.foo();
o.bar("a");
o.zoo("B", 12);
結果がこんな感じ。
name: foo
args:
name: bar
args: [a]
name: zoo
args: [B, 12]