X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FReflection.java;h=3a129d48db8b89c21515aba9102a63b0f2a93a87;hp=cf683f0871140f77def03ce5995d692153d06ca2;hb=0f0ed458838eb080e12ad9a52a46a4060d40df43;hpb=0a0227b9180534d2a431f3d6e08a398bde2244c4 diff --git a/src/edu/berkeley/sbp/util/Reflection.java b/src/edu/berkeley/sbp/util/Reflection.java index cf683f0..3a129d4 100644 --- a/src/edu/berkeley/sbp/util/Reflection.java +++ b/src/edu/berkeley/sbp/util/Reflection.java @@ -1,11 +1,12 @@ package edu.berkeley.sbp.util; import java.io.*; import java.lang.reflect.*; +import java.lang.annotation.*; /** Random reflection-related utilities */ public final class Reflection { - - private static Object rebuild(Object o, Class c) { + + public static Object rebuild(Object o, Class c) { //System.out.println("rebuild " + o + " (a " + (o==null?null:o.getClass().getName()) + ") " + c); if (o==null || c.isAssignableFrom(o.getClass())) return o; if ((c == Character.class || c == Character.TYPE) && o instanceof String && ((String)o).length()==1) return new Character(((String)o).charAt(0)); @@ -23,10 +24,16 @@ public final class Reflection { } if (c == String.class) { boolean ok = true; - for(int i=0; iClass.forName that returns null instead of throwing an exception */ public static Class forNameOrNull(String s) { try { @@ -72,6 +121,7 @@ public final class Reflection { } } + public static Object fuzzyInvoke(Object o, Member m) { return fuzzyInvoke(o, m, new Object[0]); } /** invoke method/constructor m on object o with arguments args, and perform reasonable coercions as needed */ public static Object fuzzyInvoke(Object o, Member m, Object[] args) { try { @@ -119,4 +169,219 @@ public final class Reflection { return o+""; } + public static boolean isConcrete(Class c) { + if ((c.getModifiers() & Modifier.ABSTRACT) != 0) return false; + if ((c.getModifiers() & Modifier.INTERFACE) != 0) return false; + return true; + } + public static boolean isStatic(Field f) { + if ((f.getModifiers() & Modifier.STATIC) != 0) return true; + return false; + } + + public static Field getField(Class c, String s) { + try { + for(Field f : c.getDeclaredFields()) + if (f.getName().equals(s)) + return f; + } catch (Exception e) { } + if (c.getSuperclass()==null || c.getSuperclass()==c) return null; + return getField(c.getSuperclass(), s); + } + public static Field getField(Class c, int i) { + try { + for(Field f : c.getDeclaredFields()) { + if (isStatic(f)) continue; + return f; + } + if (c.getSuperclass()==null || c.getSuperclass()==c) return null; + return getField(c.getSuperclass(), i); + } catch (Exception e) { } + return null; + } + + public static interface Show { + } + + public static Object impose(Object o, Object[] fields) { + if (o instanceof Class) return impose((Class)o, fields); + if (o instanceof Method) return impose((Method)o, fields); + if (o instanceof Constructor) return impose((Constructor)o, fields); + return null; + } + public static Object impose(Class _class, Object[] fields) { + try { + Object ret = _class.newInstance(); + Field[] f = _class.getFields(); + int j = 0; + for(int i=0; i A getAnnotation(Class c); + public abstract Object impose(Object[] fields); + public boolean isAnnotationPresent(Class c) { return getAnnotation(c) != null; } + + public abstract Annotation[][] getArgAnnotations(); + public abstract String[] getArgNames(); + + 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); } + 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]; } + } + 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); } + 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]; } + } + 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); } + public Object impose(Object[] fields) { return Reflection.impose(_class, fields); } + public Annotation[][] getArgAnnotations() { + Field[] fields = _class.getFields(); + Annotation[][] ret = new Annotation[fields.length][]; + for(int i=0; i