--- ./jaxb-ri-base/runtime/src/com/sun/xml/bind/v2/runtime/reflect/opt/Injector.java 2007-05-31 23:32:10.000000000 +0100 +++ ./jaxb-ri/runtime/src/com/sun/xml/bind/v2/runtime/reflect/opt/Injector.java 2009-03-20 12:36:51.000000000 +0000 @@ -68,8 +68,8 @@ * * We only need one injector per one user class loader. */ - private static final Map> injectors = - Collections.synchronizedMap(new WeakHashMap>()); + private static final Map injectors = + Collections.synchronizedMap(new WeakHashMap()); private static final Logger logger = Util.getClassLogger(); @@ -82,7 +82,7 @@ static Class inject( ClassLoader cl, String className, byte[] image ) { Injector injector = get(cl); if(injector!=null) - return injector.inject(className,image); + return injector.internalInject(cl,className,image); else return null; } @@ -93,7 +93,7 @@ static Class find( ClassLoader cl, String className ) { Injector injector = get(cl); if(injector!=null) - return injector.find(className); + return injector.internalFind(cl,className); else return null; } @@ -105,26 +105,23 @@ * if it fails. */ private static Injector get(ClassLoader cl) { - Injector injector = null; - WeakReference wr = injectors.get(cl); - if(wr!=null) - injector = wr.get(); + Injector injector = injectors.get(cl); + if(injector==null) try { - injectors.put(cl,new WeakReference(injector = new Injector(cl))); + injectors.put(cl,injector = new Injector(cl)); } catch (SecurityException e) { logger.log(Level.FINE,"Unable to set up a back-door for the injector",e); return null; } + return injector; } /** * Injected classes keyed by their names. */ - private final Map classes = new HashMap(); - - private final ClassLoader parent; + private final Map> classes = new HashMap>(); /** * True if this injector is capable of injecting accessors. @@ -155,7 +152,6 @@ } private Injector(ClassLoader parent) { - this.parent = parent; assert parent!=null; boolean loadable = false; @@ -170,11 +166,14 @@ } - private synchronized Class inject(String className, byte[] image) { + private synchronized Class internalInject(ClassLoader parent, String className, byte[] image) { if(!loadable) // this injector cannot inject anything return null; - Class c = classes.get(className); + Class c = null; + WeakReference ref = classes.get(className); + if (ref != null) + c = ref.get(); if(c==null) { // we need to inject a class into the try { @@ -193,12 +192,31 @@ logger.log(Level.FINE,"Unable to inject "+className,e); return null; } - classes.put(className,c); + classes.put(className,new WeakReference(c)); } return c; } - private synchronized Class find(String className) { - return classes.get(className); + private synchronized Class internalFind(ClassLoader parent, String className) { + Class clazz = null; + WeakReference ref = classes.get(className); + if (ref != null) + { + clazz = ref.get(); + if (clazz==null) + { + // If we have a reference but no class the class must have been + // loaded at some point. + try { + clazz = parent.loadClass(className); + } catch (ClassNotFoundException e) { + // If this fails then null can be returned so the class can + // be redefined. + logger.log(Level.FINE,"Unable to load "+className,e); + } + } + } + + return clazz; } }