--- old/jdk/src/share/classes/java/lang/Class.java 2013-06-10 17:24:01.544012915 +0400 +++ new/jdk/src/share/classes/java/lang/Class.java 2013-06-10 17:24:01.332012910 +0400 @@ -708,8 +708,9 @@ */ @SuppressWarnings("unchecked") public TypeVariable>[] getTypeParameters() { - if (getGenericSignature() != null) - return (TypeVariable>[])getGenericInfo().getTypeParameters(); + ClassRepository info = getGenericInfo(); + if (info != null) + return (TypeVariable>[])info.getTypeParameters(); else return (TypeVariable>[])new TypeVariable[0]; } @@ -759,15 +760,19 @@ * @since 1.5 */ public Type getGenericSuperclass() { - if (getGenericSignature() != null) { - // Historical irregularity: - // Generic signature marks interfaces with superclass = Object - // but this API returns null for interfaces - if (isInterface()) - return null; - return getGenericInfo().getSuperclass(); - } else + ClassRepository info = getGenericInfo(); + if (info == null) { return getSuperclass(); + } + + // Historical irregularity: + // Generic signature marks interfaces with superclass = Object + // but this API returns null for interfaces + if (isInterface()) { + return null; + } + + return info.getSuperclass(); } /** @@ -830,7 +835,15 @@ * * @return an array of interfaces implemented by this class. */ - public native Class[] getInterfaces(); + public Class[] getInterfaces() { + ReflectionData rd = reflectionData(); + if (rd.interfaces == null) { + rd.interfaces = getInterfaces0(); + } + return rd.interfaces.clone(); + } + + private native Class[] getInterfaces0(); /** * Returns the {@code Type}s representing the interfaces @@ -882,10 +895,8 @@ * @since 1.5 */ public Type[] getGenericInterfaces() { - if (getGenericSignature() != null) - return getGenericInfo().getSuperInterfaces(); - else - return getInterfaces(); + ClassRepository info = getGenericInfo(); + return (info == null) ? getInterfaces() : info.getSuperInterfaces(); } @@ -2313,6 +2324,10 @@ // Intermediate results for getFields and getMethods volatile Field[] declaredPublicFields; volatile Method[] declaredPublicMethods; + volatile Class[] interfaces; + volatile boolean genericSignatureResolved; + volatile String genericSignature; + // Value of classRedefinedCount when we created this ReflectionData instance final int redefinedCount; @@ -2387,11 +2402,20 @@ } } + private String getGenericSignature() { + ReflectionData rd = reflectionData(); + if (!rd.genericSignatureResolved) { + rd.genericSignature = getGenericSignature0(); + rd.genericSignatureResolved = true; + } + return rd.genericSignature; + } + // Generic signature handling - private native String getGenericSignature(); + private native String getGenericSignature0(); // Generic info repository; lazily initialized - private transient ClassRepository genericInfo; + private volatile transient ClassRepository genericInfo; // accessor for factory private GenericsFactory getFactory() { @@ -2399,15 +2423,21 @@ return CoreReflectionFactory.make(this, ClassScope.make(this)); } - // accessor for generic info repository + // accessor for generic info repository; + // generic info is lazily initialized private ClassRepository getGenericInfo() { - // lazily initialize repository if necessary - if (genericInfo == null) { - // create and cache generic info repository - genericInfo = ClassRepository.make(getGenericSignature(), - getFactory()); + ClassRepository info = genericInfo; + if (info != null) { + return info; } - return genericInfo; //return cached repository + + String signature = getGenericSignature(); + if (signature == null) { + return null; + } + + genericInfo = ClassRepository.make(signature, getFactory()); + return genericInfo; } // Annotations handling