1 | //static final Map<Class, HashMap<S, Field>> getOpt_cache = newDangerousWeakHashMap(f getOpt_special_init); |
2 | |
3 | sclass getOpt_Map extends WeakHashMap { |
4 | *() { |
5 | if (getOpt_special == null) getOpt_special = new HashMap; |
6 | clear(); |
7 | } |
8 | |
9 | public void clear() { |
10 | super.clear(); |
11 | //print("getOpt clear"); |
12 | put(Class.class, getOpt_special); |
13 | put(S.class, getOpt_special); |
14 | } |
15 | } |
16 | |
17 | static final Map<Class, HashMap<S, Field>> getOpt_cache = |
18 | ifdef AssumeNoClassUnloading |
19 | syncHashMap(); |
20 | endifdef |
21 | ifndef AssumeNoClassUnloading |
22 | _registerDangerousWeakMap(synchroMap(new getOpt_Map)); |
23 | endifndef |
24 | |
25 | static HashMap getOpt_special; // just a marker |
26 | |
27 | /*static void getOpt_special_init(Map map) { |
28 | map.put(Class.class, getOpt_special); |
29 | map.put(S.class, getOpt_special); |
30 | }*/ |
31 | |
32 | static Map<S, Field> getOpt_getFieldMap(O o) { |
33 | Class c = _getClass(o); |
34 | HashMap<S, Field> map = getOpt_cache.get(c); |
35 | if (map == null) |
36 | map = getOpt_makeCache(c); |
37 | ret map; |
38 | } |
39 | |
40 | static Object getOpt_cached(Object o, String field) ctex { |
41 | if (o == null) ret null; |
42 | |
43 | Map<S, Field> map = getOpt_getFieldMap(o); |
44 | |
45 | if (map == getOpt_special) { |
46 | if (o instanceof Class) |
47 | return getOpt((Class) o, field); |
48 | /*if (o instanceof S) |
49 | ret getOpt(getBot((S) o), field);*/ |
50 | if (o instanceof Map) |
51 | ret ((Map) o).get(field); |
52 | } |
53 | |
54 | Field f = map.get(field); |
55 | if (f != null) ret f.get(o); |
56 | ifclass DynamicObject |
57 | if (o instanceof DynamicObject) |
58 | ret syncMapGet2(((DynamicObject) o).fieldValues, field); |
59 | endif |
60 | ret null; |
61 | } |
62 | |
63 | // used internally - we are in synchronized block |
64 | static HashMap<S, Field> getOpt_makeCache(Class c) { |
65 | HashMap<S, Field> map; |
66 | if (isSubtypeOf(c, Map.class)) |
67 | map = getOpt_special; |
68 | else { |
69 | map = new HashMap; |
70 | new HashSet<Class> interfaces; |
71 | if (!reflection_classesNotToScan().contains(c.getName())) { |
72 | Class _c = c; |
73 | do { |
74 | for (Field f : _c.getDeclaredFields()) { |
75 | makeAccessible(f); |
76 | S name = f.getName(); |
77 | if (!map.containsKey(name)) |
78 | map.put(name, f); |
79 | } |
80 | for (intf : c.getInterfaces()) |
81 | interfaces.add(intf); |
82 | _c = _c.getSuperclass(); |
83 | } while (_c != null); |
84 | |
85 | // Scan interfaces for static final fields |
86 | |
87 | for (intf : interfaces) { |
88 | for (Field f : intf.getDeclaredFields()) { |
89 | makeAccessible(f); |
90 | S name = f.getName(); |
91 | if (!map.containsKey(name)) |
92 | map.put(name, f); |
93 | } |
94 | } |
95 | } |
96 | } |
97 | |
98 | if (getOpt_cache != null) getOpt_cache.put(c, map); |
99 | ret map; |
100 | } |
Began life as a copy of #1005583
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mqqgnosmbjvj, wnsclhtenguj
No comments. add comment
Snippet ID: | #1036538 |
Snippet name: | getOpt_cached (branch with scanning interfaces for fields) |
Eternal ID of this version: | #1036538/1 |
Text MD5: | 52bdf71247db905c8999da3b789d70cf |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2023-01-31 19:44:48 |
Source code size: | 2686 bytes / 100 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 261 / 247 |
Referenced in: | [show references] |