--- glassfish-jaxb-2.1.9/runtime/src/com/sun/xml/bind/v2/runtime/reflect/opt/Injector.java    2007-05-31 23:32:10.000000000 +0100
+++ glassfish-jaxb-2.1.9/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<ClassLoader,WeakReference<Injector>> injectors =
-        Collections.synchronizedMap(new WeakHashMap<ClassLoader,WeakReference<Injector>>());
+    private static final Map<ClassLoader,Injector> injectors =
+        Collections.synchronizedMap(new WeakHashMap<ClassLoader,Injector>());
 
     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<Injector> 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>(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<String,Class> classes = new HashMap<String,Class>();
-
-    private final ClassLoader parent;
+    private final Map<String,WeakReference<Class>> classes = new HashMap<String,WeakReference<Class>>();
 
     /**
      * 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<Class> 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<Class>(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<Class> 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; 
     }
 }

