X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fbind%2FBindable.java;h=4a10187bf6b720bdbead0042a6eaeba02f82b3da;hp=9e5564ebbf72fb995abda48ef577eaf3612adc11;hb=c8a17fdd2e149fe5feecd96c71b7f2cab286ab96;hpb=0bf2fced924400a496fb154be71188864296564c
diff --git a/src/edu/berkeley/sbp/bind/Bindable.java b/src/edu/berkeley/sbp/bind/Bindable.java
index 9e5564e..4a10187 100644
--- a/src/edu/berkeley/sbp/bind/Bindable.java
+++ b/src/edu/berkeley/sbp/bind/Bindable.java
@@ -10,7 +10,7 @@ import java.lang.reflect.*;
import java.io.*;
import static edu.berkeley.sbp.util.Reflection.*;
-public abstract class Bindable {
+public abstract class Bindable implements ToJava {
public abstract String getSimpleName();
public abstract String toString();
@@ -20,6 +20,7 @@ public abstract class Bindable {
public abstract Annotation[][] getArgAnnotations();
public abstract String[] getArgNames();
+ public abstract Class[] getArgTypes();
public static Bindable create(Object o) {
if (o instanceof Class) return new BindableClass((Class)o);
@@ -37,17 +38,35 @@ public abstract class Bindable {
public Object impose(Object[] fields) { return Reflection.impose(_method, fields); }
public Annotation[][] getArgAnnotations() { return _method.getParameterAnnotations(); }
public String[] getArgNames() { return new String[_method.getParameterTypes().length]; }
+ public Class[] getArgTypes() { return _method.getParameterTypes(); }
+ public void toJava(StringBuffer sb) {
+ sb.append("Bindable.create(");
+ sb.append(_method.getDeclaringClass().getName().replace('$','.'));
+ sb.append(".class.getMethod(\"");
+ sb.append(_method.getName());
+ sb.append("\", ");
+ appendClassArray(sb, _method.getParameterTypes());
+ sb.append("))");
+ }
}
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 String getSimpleName() { return _constructor.getDeclaringClass().getSimpleName(); }
public A getAnnotation(Class c) { return _constructor.getAnnotation(c); }
public Object impose(Object[] fields) { return Reflection.impose(_constructor, fields); }
public Annotation[][] getArgAnnotations() { return _constructor.getParameterAnnotations(); }
public String[] getArgNames() { return new String[_constructor.getParameterTypes().length]; }
+ public Class[] getArgTypes() { return _constructor.getParameterTypes(); }
+ public void toJava(StringBuffer sb) {
+ sb.append("Bindable.create(");
+ sb.append(_constructor.getDeclaringClass().getName().replace('$','.'));
+ sb.append(".class.getConstructor(");
+ appendClassArray(sb, _constructor.getParameterTypes());
+ sb.append("))");
+ }
}
private static class BindableClass extends Bindable {
@@ -71,6 +90,34 @@ public abstract class Bindable {
ret[i] = fields[i].getName();
return ret;
}
+ public Class[] getArgTypes() {
+ Field[] fields = _class.getFields();
+ Class[] ret = new Class[fields.length];
+ for(int i=0; i