< prev index next >

test/jdk/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/CustomSystemClassLoader.java

Print this page

        

@@ -26,10 +26,12 @@
 import java.net.URL;
 import java.nio.file.Files;
 import java.security.AllPermission;
 import java.security.Permissions;
 import java.security.ProtectionDomain;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 /**
  * A custom ClassLoader to load the concrete LoggerFinder class
  * with all permissions.

@@ -37,23 +39,26 @@
  * @author danielfuchs
  */
 public class CustomSystemClassLoader extends ClassLoader {
 
 
-    Class<?> loggerFinderClass = null;
+    final ConcurrentHashMap<String, Class<?>> classes = new ConcurrentHashMap<>();
 
     public CustomSystemClassLoader() {
         super();
     }
     public CustomSystemClassLoader(ClassLoader parent) {
         super(parent);
     }
 
     private Class<?> defineFinderClass(String name)
         throws ClassNotFoundException {
+        Class<?> loggerFinderClass = classes.get(name);
+        if (loggerFinderClass != null) return loggerFinderClass;
         final Object obj = getClassLoadingLock(name);
         synchronized(obj) {
+            loggerFinderClass = classes.get(name);
             if (loggerFinderClass != null) return loggerFinderClass;
 
             URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation();
             File file = new File(url.getPath(), name+".class");
             if (file.canRead()) {

@@ -64,10 +69,11 @@
                     loggerFinderClass = defineClass(
                             name, b, 0, b.length, new ProtectionDomain(
                             this.getClass().getProtectionDomain().getCodeSource(),
                             perms));
                     System.out.println("Loaded " + name);
+                    classes.put(name, loggerFinderClass);
                     return loggerFinderClass;
                 } catch (Throwable ex) {
                     ex.printStackTrace();
                     throw new ClassNotFoundException(name, ex);
                 }

@@ -78,11 +84,11 @@
         }
     }
 
     @Override
     public synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
-        if (name.endsWith("$LogProducerFinder")) {
+        if (name.equals("LogProducerFinder") || name.startsWith("LogProducerFinder$")) {
             Class<?> c = defineFinderClass(name);
             if (resolve) {
                 resolveClass(c);
             }
             return c;

@@ -90,11 +96,11 @@
         return super.loadClass(name, resolve);
     }
 
     @Override
     protected Class<?> findClass(String name) throws ClassNotFoundException {
-        if (name.endsWith("$$LogProducerFinder")) {
+        if (name.equals("LogProducerFinder") || name.startsWith("LogProducerFinder$")) {
             return defineFinderClass(name);
         }
         return super.findClass(name);
     }
 
< prev index next >