X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FReflection.java;h=ab77c921cea1396b77419d72adec327eddf68426;hp=beb8d419ec9dac666507e5821f546d31926fde58;hb=f069d11a0bc59d63b078df8a4aa488498c4e9cc2;hpb=0db242407cbae04f1a55086bf2bd31f5ae1bb7a8 diff --git a/src/edu/berkeley/sbp/util/Reflection.java b/src/edu/berkeley/sbp/util/Reflection.java index beb8d41..ab77c92 100644 --- a/src/edu/berkeley/sbp/util/Reflection.java +++ b/src/edu/berkeley/sbp/util/Reflection.java @@ -1,11 +1,15 @@ +// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license + package edu.berkeley.sbp.util; import java.io.*; import java.lang.reflect.*; +import java.lang.annotation.*; +// FIXME: decent error reporting /** 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)); @@ -40,6 +44,7 @@ public final class Reflection { Object[] ret = (Object[])Array.newInstance(c.getComponentType(), 1); ret[0] = o; return ret; + } else if (c==int.class && o instanceof Number) { return o; } else { throw new Error("unable to cast " + o + " from " + o.getClass().getName() + " to " + c.getName()); } @@ -50,13 +55,50 @@ public final class Reflection { return (Object[])Array.newInstance(c, i); } + public static String show(Object o) { + if (o==null) return "null"; + if (o instanceof Show) return show((Show)o); + if (! (o instanceof Object[])) return o.toString() + " : " + o.getClass().getName(); + Object[] arr = (Object[])o; + StringBuffer ret = new StringBuffer(); + ret.append(o.getClass().getComponentType().getName()); + ret.append("["+arr.length+"]:"); + for(int i=0; iClass.forName that returns null instead of throwing an exception */ public static Class forNameOrNull(String s) { try { @@ -126,4 +174,172 @@ 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) { + Object ret = null; + try { ret = _class.newInstance(); } + catch (Exception e) { rethrow(e, "while trying to instantiate a " + _class.getName()); } + Field[] f = _class.getFields(); + int j = 0; + for(int i=0; i