Mercurial Hosting > luan
comparison src/luan/modules/JavaLuan.java @ 778:305ffb00ebc1
improve synchronization in JavaLuan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 28 Aug 2016 03:26:39 -0600 |
parents | 1a68fc55a80c |
children | 4083f5a67c63 |
comparison
equal
deleted
inserted
replaced
777:1460d297e960 | 778:305ffb00ebc1 |
---|---|
204 } | 204 } |
205 | 205 |
206 public static boolean privateAccess = false; | 206 public static boolean privateAccess = false; |
207 private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>(); | 207 private static Map<Class,Map<String,List<Member>>> memberMap = new HashMap<Class,Map<String,List<Member>>>(); |
208 | 208 |
209 private static synchronized List<Member> getMembers(Class cls,String name) { | 209 private static List<Member> getMembers(Class cls,String name) { |
210 Map<String,List<Member>> clsMap = memberMap.get(cls); | 210 Map<String,List<Member>> clsMap; |
211 if( clsMap == null ) { | 211 synchronized(memberMap) { |
212 clsMap = new HashMap<String,List<Member>>(); | 212 clsMap = memberMap.get(cls); |
213 for( Class c : cls.getClasses() ) { | 213 if( clsMap == null ) { |
214 String s = c.getSimpleName(); | 214 clsMap = new HashMap<String,List<Member>>(); |
215 List<Member> list = new ArrayList<Member>(); | 215 for( Class c : cls.getClasses() ) { |
216 clsMap.put(s,list); | 216 String s = c.getSimpleName(); |
217 list.add(new Static(c)); | 217 List<Member> list = new ArrayList<Member>(); |
218 } | |
219 for( Field field : cls.getFields() ) { | |
220 String s = field.getName(); | |
221 try { | |
222 if( !cls.getField(s).equals(field) ) | |
223 continue; // not accessible | |
224 } catch(NoSuchFieldException e) { | |
225 throw new RuntimeException(e); | |
226 } | |
227 List<Member> list = new ArrayList<Member>(); | |
228 clsMap.put(s,list); | |
229 list.add(field); | |
230 } | |
231 for( Method method : cls.getMethods() ) { | |
232 String s = method.getName(); | |
233 List<Member> list = clsMap.get(s); | |
234 if( list == null || !(list.get(0) instanceof Method) ) { | |
235 list = new ArrayList<Member>(); | |
236 clsMap.put(s,list); | 218 clsMap.put(s,list); |
237 } | 219 list.add(new Static(c)); |
238 list.add(method); | 220 } |
239 } | 221 for( Field field : cls.getFields() ) { |
240 if( privateAccess ) { | 222 String s = field.getName(); |
241 for( Method method : cls.getDeclaredMethods() ) { | 223 try { |
224 if( !cls.getField(s).equals(field) ) | |
225 continue; // not accessible | |
226 } catch(NoSuchFieldException e) { | |
227 throw new RuntimeException(e); | |
228 } | |
229 List<Member> list = new ArrayList<Member>(); | |
230 clsMap.put(s,list); | |
231 list.add(field); | |
232 } | |
233 for( Method method : cls.getMethods() ) { | |
242 String s = method.getName(); | 234 String s = method.getName(); |
243 List<Member> list = clsMap.get(s); | 235 List<Member> list = clsMap.get(s); |
244 if( list == null ) { | 236 if( list == null || !(list.get(0) instanceof Method) ) { |
245 list = new ArrayList<Member>(); | 237 list = new ArrayList<Member>(); |
246 clsMap.put(s,list); | 238 clsMap.put(s,list); |
247 } else if( !(list.get(0) instanceof Method) ) | 239 } |
248 continue; | 240 list.add(method); |
249 if( !list.contains(method) ) { | 241 } |
250 list.add(method); | 242 if( privateAccess ) { |
251 } | 243 for( Method method : cls.getDeclaredMethods() ) { |
252 } | 244 String s = method.getName(); |
253 for( Field field : cls.getDeclaredFields() ) { | 245 List<Member> list = clsMap.get(s); |
254 String s = field.getName(); | 246 if( list == null ) { |
255 List<Member> list = clsMap.get(s); | 247 list = new ArrayList<Member>(); |
256 if( list == null ) { | 248 clsMap.put(s,list); |
257 list = new ArrayList<Member>(); | 249 } else if( !(list.get(0) instanceof Method) ) |
258 clsMap.put(s,list); | 250 continue; |
259 list.add(field); | 251 if( !list.contains(method) ) { |
260 } | 252 list.add(method); |
261 } | 253 } |
262 } | 254 } |
263 for( List<Member> members : clsMap.values() ) { | 255 for( Field field : cls.getDeclaredFields() ) { |
264 for( Member m : members ) { | 256 String s = field.getName(); |
265 if( m instanceof AccessibleObject ) | 257 List<Member> list = clsMap.get(s); |
266 ((AccessibleObject)m).setAccessible(true); | 258 if( list == null ) { |
267 } | 259 list = new ArrayList<Member>(); |
268 } | 260 clsMap.put(s,list); |
269 memberMap.put(cls,clsMap); | 261 list.add(field); |
262 } | |
263 } | |
264 } | |
265 for( List<Member> members : clsMap.values() ) { | |
266 for( Member m : members ) { | |
267 if( m instanceof AccessibleObject ) | |
268 ((AccessibleObject)m).setAccessible(true); | |
269 } | |
270 } | |
271 memberMap.put(cls,clsMap); | |
272 } | |
270 } | 273 } |
271 List<Member> rtn = clsMap.get(name); | 274 List<Member> rtn = clsMap.get(name); |
272 if( rtn==null ) | 275 if( rtn==null ) |
273 rtn = Collections.emptyList(); | 276 rtn = Collections.emptyList(); |
274 return rtn; | 277 return rtn; |
275 } | 278 } |
276 | 279 |
277 private static synchronized List<Member> getStaticMembers(Class cls,String name) { | 280 private static List<Member> getStaticMembers(Class cls,String name) { |
278 List<Member> staticMembers = new ArrayList<Member>(); | 281 List<Member> staticMembers = new ArrayList<Member>(); |
279 for( Member m : getMembers(cls,name) ) { | 282 for( Member m : getMembers(cls,name) ) { |
280 if( Modifier.isStatic(m.getModifiers()) ) | 283 if( Modifier.isStatic(m.getModifiers()) ) |
281 staticMembers.add(m); | 284 staticMembers.add(m); |
282 } | 285 } |