//static final Map> getOpt_cache = newDangerousWeakHashMap(f getOpt_special_init); sclass getOpt_Map extends WeakHashMap { *() { if (getOpt_special == null) getOpt_special = new HashMap; clear(); } public void clear() { super.clear(); //print("getOpt clear"); put(Class.class, getOpt_special); put(S.class, getOpt_special); } } static final Map> getOpt_cache = ifdef AssumeNoClassUnloading syncHashMap(); endifdef ifndef AssumeNoClassUnloading _registerDangerousWeakMap(synchroMap(new getOpt_Map)); endifndef static HashMap getOpt_special; // just a marker /*static void getOpt_special_init(Map map) { map.put(Class.class, getOpt_special); map.put(S.class, getOpt_special); }*/ static Map getOpt_getFieldMap(O o) { Class c = _getClass(o); HashMap map = getOpt_cache.get(c); if (map == null) map = getOpt_makeCache(c); ret map; } static Object getOpt_cached(Object o, String field) ctex { if (o == null) ret null; Map map = getOpt_getFieldMap(o); if (map == getOpt_special) { if (o instanceof Class) return getOpt((Class) o, field); /*if (o instanceof S) ret getOpt(getBot((S) o), field);*/ if (o instanceof Map) ret ((Map) o).get(field); } Field f = map.get(field); if (f != null) ret f.get(o); ifclass DynamicObject if (o instanceof DynamicObject) ret syncMapGet2(((DynamicObject) o).fieldValues, field); endif ret null; } // used internally - we are in synchronized block static HashMap getOpt_makeCache(Class c) { HashMap map; if (isSubtypeOf(c, Map.class)) map = getOpt_special; else { map = new HashMap; if (!reflection_classesNotToScan().contains(c.getName())) { Class _c = c; do { for (Field f : _c.getDeclaredFields()) { makeAccessible(f); S name = f.getName(); if (!map.containsKey(name)) map.put(name, f); } _c = _c.getSuperclass(); } while (_c != null); } } if (getOpt_cache != null) getOpt_cache.put(c, map); ret map; }