On Jul 22, 8:34 am, "Ruland Kevin-BHP637" <[EMAIL PROTECTED]> wrote: > Hi all, > > I would like to have NativeJavaObject restrict the methods that it > expses to JavaScript. In particular, I would like to not expose the > java.lang.Object methods which are associated with every object. Also, > I would like the methods to not be enumerable. > > Short of rewriting JavaMembers is there any alternative? > > Thanks > > Kevin Ruland
Kevin, In my quest to solve this problem (http://groups.google.com/group/ mozilla.dev.tech.js-engine.rhino/browse_thread/thread/ 9131211041437639#), I came up with one solution which was to implement my own wrap factory which wrapped native java objects with scriptables having the standard NativeJavaObject as its prototype. This allows you to add and remove properties from java objects, while keeping the delegation to the native methods intact. import org.mozilla.javascript.*; public class ScriptableNativeJavaObject extends ScriptableObject { NativeJavaObject prototype; public ScriptableNativeJavaObject(Scriptable scope, Object javaObject, Class staticType) { super(scope, new NativeJavaObject(scope, javaObject, staticType)); this.prototype = (NativeJavaObject) this.getPrototype(); } public String getClassName() { return prototype.unwrap().getClass().getName(); } public static class ScriptableNativeContextFactory extends ContextFactory { protected Context makeContext() { Context cx = super.makeContext(); cx.setWrapFactory(new ScriptableNativeWrapFactory()); return cx; } } public static class ScriptableNativeWrapFactory extends WrapFactory { public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, Object javaObject, Class staticType) { return new ScriptableNativeJavaObject(scope, javaObject, staticType); } } public static void main(String[] args) { new ScriptableNativeContextFactory().call(new ContextAction() { public Object run(Context cx) { return cx.evaluateString(cx.initStandardObjects(), "var o = new java.lang.Object(); " + "o.name = 'bar'; " + "java.lang.System.out.println(o.name + ': ' + o.hashCode())", "str", 1, null); } }); } } prints: bar: 1579795854 so you can see that the java.lang.Object instance has both hashCode() as well as the dynamic property 'name' There's no reason you couldn't do the same technique but instead of delegating to NativeJavaObject, just return instances of an extended NativeJavaObject to override the get() method to specifically exclude the methods you want to hide. Not sure if this is ideal for you, but it's a thought. _______________________________________________ dev-tech-js-engine-rhino mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino
