--- old/src/share/classes/java/lang/reflect/Constructor.java 2011-03-17 14:49:47.000000000 -0700 +++ new/src/share/classes/java/lang/reflect/Constructor.java 2011-03-17 14:49:47.000000000 -0700 @@ -74,14 +74,6 @@ private byte[] annotations; private byte[] parameterAnnotations; - // For non-public members or members in package-private classes, - // it is necessary to perform somewhat expensive security checks. - // If the security check succeeds for a given class, it will - // always succeed (it is not affected by the granting or revoking - // of permissions); we speed up the check in the common case by - // remembering the last Class for which the check succeeded. - private volatile Class securityCheckCache; - // Generics infrastructure // Accessor for factory private GenericsFactory getFactory() { @@ -518,16 +510,18 @@ if (!override) { if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) { Class caller = Reflection.getCallerClass(2); - if (securityCheckCache != caller) { - Reflection.ensureMemberAccess(caller, clazz, null, modifiers); - securityCheckCache = caller; - } + + checkAccess(caller, clazz, null, modifiers); } } if ((clazz.getModifiers() & Modifier.ENUM) != 0) throw new IllegalArgumentException("Cannot reflectively create enum objects"); - if (constructorAccessor == null) acquireConstructorAccessor(); - return (T) constructorAccessor.newInstance(initargs); + ConstructorAccessor ca = constructorAccessor; // read volatile + if (ca == null) { + acquireConstructorAccessor(); + ca = constructorAccessor; // read volatile + } + return (T) ca.newInstance(initargs); } /**