diff --git a/src/java/ognl/OgnlRuntime.java b/src/java/ognl/OgnlRuntime.java index 9bc48300..727b1d4a 100644 --- a/src/java/ognl/OgnlRuntime.java +++ b/src/java/ognl/OgnlRuntime.java @@ -820,46 +820,15 @@ public static Object invokeMethod(Object target, Method method, Object[] argsArr throws InvocationTargetException, IllegalAccessException { boolean syncInvoke = false; - boolean checkPermission = false; // only synchronize method invocation if it actually requires it synchronized(method) { - if (_methodAccessCache.get(method) == null - || _methodAccessCache.get(method) == Boolean.TRUE) { - syncInvoke = true; - } - - if (_securityManager != null && _methodPermCache.get(method) == null - || _methodPermCache.get(method) == Boolean.FALSE) { - checkPermission = true; - } - } - - Object result; - boolean wasAccessible = true; - - if (syncInvoke) - { - synchronized(method) - { - if (checkPermission) - { - try - { - _securityManager.checkPermission(getPermission(method)); - _methodPermCache.put(method, Boolean.TRUE); - } catch (SecurityException ex) { - _methodPermCache.put(method, Boolean.FALSE); - throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); - } - } - + if (_methodAccessCache.get(method) == null) { if (!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) { - if (!(wasAccessible = ((AccessibleObject) method).isAccessible())) + if (!(((AccessibleObject) method).isAccessible())) { - ((AccessibleObject) method).setAccessible(true); _methodAccessCache.put(method, Boolean.TRUE); } else { @@ -869,28 +838,43 @@ public static Object invokeMethod(Object target, Method method, Object[] argsArr { _methodAccessCache.put(method, Boolean.FALSE); } + } + if (_methodAccessCache.get(method) == Boolean.TRUE) { + syncInvoke = true; + } - result = method.invoke(target, argsArray); - - if (!wasAccessible) - { - ((AccessibleObject) method).setAccessible(false); + if (_methodPermCache.get(method) == null) { + if (_securityManager != null) { + try + { + _securityManager.checkPermission(getPermission(method)); + _methodPermCache.put(method, Boolean.TRUE); + } catch (SecurityException ex) { + _methodPermCache.put(method, Boolean.FALSE); + throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); + } } - } - } else - { - if (checkPermission) - { - try - { - _securityManager.checkPermission(getPermission(method)); + else { _methodPermCache.put(method, Boolean.TRUE); - } catch (SecurityException ex) { - _methodPermCache.put(method, Boolean.FALSE); - throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); } } + if (_methodPermCache.get(method) == Boolean.FALSE) { + throw new IllegalAccessException("Method [" + method + "] cannot be accessed."); + } + } + Object result; + + if (syncInvoke) //if is not public and is not accessible + { + synchronized(method) + { + ((AccessibleObject) method).setAccessible(true); + result = method.invoke(target, argsArray); + ((AccessibleObject) method).setAccessible(false); + } + } else + { result = method.invoke(target, argsArray); }