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;
- }
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|