From 1da9851e5aa0c1aa6063847a4a7f3f874266af3a Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 25 Mar 2005 06:30:12 +0000 Subject: [PATCH] added JSReflection.Wrap darcs-hash:20050325063012-5007d-9bb43298a2a96dee9616073bda6838881a178f14.gz --- src/org/ibex/js/JSReflection.java | 52 ++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/org/ibex/js/JSReflection.java b/src/org/ibex/js/JSReflection.java index 2f163e7..d9c241f 100644 --- a/src/org/ibex/js/JSReflection.java +++ b/src/org/ibex/js/JSReflection.java @@ -16,10 +16,56 @@ public class JSReflection extends JS.Immutable { if (o instanceof Boolean) return JSU.B(((Boolean)o).booleanValue()); if (o instanceof Number) return JSU.N((Number)o); if (o instanceof JS) return (JS)o; - if (o instanceof Object[]) { - throw new JSExn("Reflection onto Object[] not supported yet"); + if (o instanceof Object[]) throw new JSExn("Reflection onto Object[] not supported yet"); + return new Wrapper(o); + } + + public static class Wrapper extends JS.Immutable { + private final Object o; + public Wrapper(Object o) { this.o = o; } + public Object unwrap() { return o; } + public Enumeration keys() throws JSExn { throw new JSExn("JSReflection.keys() not supported yet"); } + public JS get(JS key) throws JSExn { + String k = JSU.toString(key); + Class c = o.getClass(); + while(c != null) { + try { + Field f = c.getField(k); + if (f != null) return wrap(f.get(o)); + } catch (NoSuchFieldException nfe) { + } catch (IllegalAccessException nfe) { + } catch (SecurityException nfe) { } + c = c.getSuperclass(); + } + + try { + java.lang.reflect.Method[] methods = o.getClass().getMethods(); + for(int i=0; i