| 
                         invokeMethod方法代码 
- public static Object invokeMethod(Object target, Method method, Object[] argsArray) throws InvocationTargetException, IllegalAccessException { 
 -         boolean wasAccessible = true; 
 -         if(securityManager != null) { 
 -             try { 
 -                 securityManager.checkPermission(getPermission(method)); 
 -             } catch (SecurityException var6) { 
 -                 throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); 
 -             } 
 -         } 
 -  
 -         if((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !(wasAccessible = method.isAccessible())) { 
 -             method.setAccessible(true); (1) 
 -         } 
 -  
 -         Object result = method.invoke(target, argsArray); (3) 
 -         if(!wasAccessible) { 
 -             method.setAccessible(false); (2) 
 -         } 
 -  
 -         return result; 
 -     } 
 
  
问题出现在method实际上是一个共享变量,也就是例子中的 
- public int java.util.Collections$SingletonList.size() 
 
  
方法 
当第一个线程t1至(1)行代码允许method方法可以被调用,第二个线程t2执行至(2)将method的方法设置为不可以访问。接着t1又开始执行到(3)行的时候就会发生该异常。这是一个很典型的同步问题。Ognl2.7已经修复了该问题,因为ognl源码是直接打包内嵌在mybatis包中,mybatis3.3.0版本中也已经进行了修复升级。(划重点) 
- public static Object invokeMethod(Object target, Method method, Object[] argsArray) throws InvocationTargetException, IllegalAccessException { 
 -         boolean syncInvoke = false; 
 -         boolean checkPermission = false; 
 -         int mHash = method.hashCode(); 
 -         synchronized(method) { 
 -             if(_methodAccessCache.get(Integer.valueOf(mHash)) == null || _methodAccessCache.get(Integer.valueOf(mHash)) == Boolean.TRUE) { 
 -                 syncInvoke = true; 
 -             } 
 -  
 -             if(_securityManager != null && _methodPermCache.get(Integer.valueOf(mHash)) == null || _methodPermCache.get(Integer.valueOf(mHash)) == Boolean.FALSE) { 
 -                 checkPermission = true; 
 -             } 
 -         } 
 -  
 -         boolean wasAccessible = true; 
 -         Object result; 
 -         if(syncInvoke) { 
 -             synchronized(method) { 
 -                 if(checkPermission) { 
 -                     try { 
 -                         _securityManager.checkPermission(getPermission(method)); 
 -                         _methodPermCache.put(Integer.valueOf(mHash), Boolean.TRUE); 
 -                     } catch (SecurityException var12) { 
 -                         _methodPermCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
 -                         throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); 
 -                     } 
 -                 } 
 -  
 -                 if(Modifier.isPublic(method.getModifiers()) && Modifier.isPublic(method.getDeclaringClass().getModifiers())) { 
 -                     _methodAccessCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
 -                 } else if(!(wasAccessible = method.isAccessible())) { 
 -                     method.setAccessible(true); 
 -                     _methodAccessCache.put(Integer.valueOf(mHash), Boolean.TRUE); 
 -                 } else { 
 -                     _methodAccessCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
 -                 } 
 -  
 -                 result = method.invoke(target, argsArray); 
 -                 if(!wasAccessible) { 
 -                     method.setAccessible(false); 
 -                 } 
 -             } 
 -         } else { 
 -             if(checkPermission) { 
 -                 try { 
 -                     _securityManager.checkPermission(getPermission(method)); 
 -                     _methodPermCache.put(Integer.valueOf(mHash), Boolean.TRUE); 
 -                 } catch (SecurityException var11) { 
 -                     _methodPermCache.put(Integer.valueOf(mHash), Boolean.FALSE); 
 -                     throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); 
 -                 } 
 -             } 
 -  
 -             result = method.invoke(target, argsArray); 
 -         } 
 -  
 -         return result; 
 -     } 
 
                          (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |