static A getOpt(O o, S field) {
ret (A) getOpt_cached(o, field);
}
static A mapLike getOpt(S field, O o) {
ret (A) getOpt_cached(o, field);
}
static Object getOpt_raw(Object o, String field) ctex {
Field f = getOpt_findField(o.getClass(), field);
if (f == null) null;
f.setAccessible(true);
ret f.get(o);
}
// access of static fields is not yet optimized
static A getOpt(Class c, String field) ctex {
if (c == null) null;
Field f = getOpt_findStaticField(c, field);
if (f == null) null;
f.setAccessible(true);
ret (A) f.get(null);
}
static Field getOpt_findStaticField(Class> c, String field) {
Class _c = c;
do {
for (Field f : _c.getDeclaredFields())
if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0)
return f;
_c = _c.getSuperclass();
} while (_c != null);
ret null;
}