< prev index next >
src/java.base/share/classes/sun/reflect/generics/repository/ClassRepository.java
Print this page
@@ -24,10 +24,14 @@
*/
package sun.reflect.generics.repository;
import java.lang.reflect.Type;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.function.Function;
+
import sun.reflect.generics.factory.GenericsFactory;
import sun.reflect.generics.tree.ClassSignature;
import sun.reflect.generics.tree.TypeTree;
import sun.reflect.generics.visitor.Reifier;
import sun.reflect.generics.parser.SignatureParser;
@@ -96,10 +100,34 @@
superInterfaces = value;
}
return value.clone();
}
+ private volatile Map<Object, Object> derivatives;
+ private static final Object nullDerivative = new Object();
+
+ public <D> D getDerivative(Class<?> clazz, Object key,
+ Function<Class<?>, ? extends D> function) {
+ Map<Object, Object> dm = derivatives;
+ Object d = (dm == null) ? null : dm.get(key);
+ if (d == null) {
+ d = function.apply(clazz);
+ if (d == null) d = nullDerivative;
+ // re-read derivatives reference to minimize the chance of
+ // loosing concurrent updates...
+ dm = derivatives;
+ Map<Object, Object> newDm = new IdentityHashMap<>(
+ (dm == null) ? 1 : dm.size() + 1);
+ newDm.put(key, d);
+ if (dm != null) newDm.putAll(dm);
+ derivatives = newDm;
+ }
+ @SuppressWarnings("unchecked")
+ D derivative = (d == nullDerivative) ? null : (D) d;
+ return derivative;
+ }
+
private Type computeSuperclass() {
Reifier r = getReifier(); // obtain visitor
// Extract superclass subtree from AST and reify
getTree().getSuperclass().accept(r);
return r.getResult();
< prev index next >