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 }