From 643d10e52f2a42b603785a7e50f7f8aef272dfb0 Mon Sep 17 00:00:00 2001 From: adam Date: Tue, 4 Jul 2006 21:49:12 -0400 Subject: [PATCH] checkpoint darcs-hash:20060705014912-5007d-c0abbf76e5fb71735dbf18bcbf804a42598780ce.gz --- src/edu/berkeley/sbp/misc/Demo.java | 52 ++++-------------- src/edu/berkeley/sbp/util/Reflection.java | 81 +++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 41 deletions(-) diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index 359f715..140af81 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -184,6 +184,10 @@ public class Demo { public abstract tag getTag(); public abstract nonterminal getNonTerminal(); public abstract int[] buildSequence(Production p); + + private Reflection.Bindable _bindable; + public Target(Reflection.Bindable b) { this._bindable = b; } + public boolean isCompatible(Production p) { tag t = getTag(); if (t != null && @@ -262,7 +266,7 @@ public class Demo { public static class TargetClass extends Target { public final Class _class; - public TargetClass(Class _class) { this._class = _class; } + public TargetClass(Class _class) { super(Reflection.Bindable.create(_class)); this._class = _class; } public String getName() { return _class.getSimpleName(); } public tag getTag() { return (tag)_class.getAnnotation(tag.class); } public nonterminal getNonTerminal() { return (nonterminal)_class.getAnnotation(nonterminal.class); } @@ -290,7 +294,7 @@ public class Demo { public static class TargetConstructor extends Target { public final Constructor _ctor; - public TargetConstructor(Constructor _ctor) { this._ctor = _ctor; } + public TargetConstructor(Constructor _ctor) { super(Reflection.Bindable.create(_ctor)); this._ctor = _ctor; } public String getName() { return _ctor.getName(); } public tag getTag() { return (tag)_ctor.getAnnotation(tag.class); } public nonterminal getNonTerminal() { return (nonterminal)_ctor.getAnnotation(nonterminal.class); } @@ -315,27 +319,12 @@ public class Demo { return buildSequence(p, names, argtags); } public Object plant(Object[] fields) { - try { - Class[] argTypes = _ctor.getParameterTypes(); - Object[] args = new Object[argTypes.length]; - int j = 0; - for(int i=0; i> t) { - try { - return _method.invoke(null, new Object[] { t }); - } catch (Exception e) { - throw new RuntimeException(e); - } + return Reflection.impose(_method, new Object[] { t }); } public Object plant(Object[] fields) { - try { - Class[] argTypes = _method.getParameterTypes(); - Object[] args = new Object[argTypes.length]; - int j = 0; - for(int i=0; i A getAnnotation(Class c); + public boolean isAnnotationPresent(Class c) { return getAnnotation(c) != null; } + public static Bindable create(Object o) { + if (o instanceof Class) return new BindableClass((Class)o); + if (o instanceof Method) return new BindableMethod((Method)o); + if (o instanceof Constructor) return new BindableConstructor((Constructor)o); + return null; + } + } + + private static class BindableMethod extends Bindable { + private final Method _method; + public String toString() { return "BindableMethod["+_method+"]"; } + public BindableMethod(Method _method) { this._method = _method; } + public String getSimpleName() { return _method.getName(); } + public A getAnnotation(Class c) { return _method.getAnnotation(c); } + } + private static class BindableConstructor extends Bindable { + private final Constructor _constructor; + public String toString() { return "BindableConstructor["+_constructor+"]"; } + public BindableConstructor(Constructor _constructor) { this._constructor = _constructor; } + public String getSimpleName() { return _constructor.getName(); } + public A getAnnotation(Class c) { return _constructor.getAnnotation(c); } + } + private static class BindableClass extends Bindable { + private final Class _class; + public String toString() { return "BindableClass["+_class+"]"; } + public BindableClass(Class _class) { this._class = _class; } + public String getSimpleName() { return _class.getSimpleName(); } + public A getAnnotation(Class c) { return (A)_class.getAnnotation(c); } + } + } -- 1.7.10.4