< prev index next >

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

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

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

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

@@ -64,10 +69,11 @@
                     finderClass = defineClass(
                             name, b, 0, b.length, new ProtectionDomain(
                             this.getClass().getProtectionDomain().getCodeSource(),
                             perms));
                     System.out.println("Loaded " + name);
+                    classes.put(name, finderClass);
                     return finderClass;
                 } 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("$BaseLoggerFinder")) {
+        if (name.endsWith("BaseLoggerFinder") || name.startsWith("BaseLoggerFinder$")) {
             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("$BaseLoggerFinder")) {
+        if (name.endsWith("BaseLoggerFinder") || name.startsWith("BaseLoggerFinder$")) {
             return defineFinderClass(name);
         }
         return super.findClass(name);
     }
 
< prev index next >