< prev index next >

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

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2015, 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. --- 1,7 ---- /* ! * 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,35 **** --- 26,36 ---- 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,59 **** * @author danielfuchs */ public class CustomSystemClassLoader extends ClassLoader { ! Class<?> finderClass = null; public CustomSystemClassLoader() { super(); } public CustomSystemClassLoader(ClassLoader parent) { super(parent); } private Class<?> defineFinderClass(String name) throws ClassNotFoundException { final Object obj = getClassLoadingLock(name); synchronized(obj) { if (finderClass != null) return finderClass; URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation(); File file = new File(url.getPath(), name+".class"); if (file.canRead()) { --- 38,64 ---- * @author danielfuchs */ public class CustomSystemClassLoader extends ClassLoader { ! 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,73 **** --- 69,79 ---- 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,88 **** } } @Override public synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { ! if (name.endsWith("$BaseLoggerFinder")) { Class<?> c = defineFinderClass(name); if (resolve) { resolveClass(c); } return c; --- 84,94 ---- } } @Override public synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { ! if (name.endsWith("BaseLoggerFinder") || name.startsWith("BaseLoggerFinder$")) { Class<?> c = defineFinderClass(name); if (resolve) { resolveClass(c); } return c;
*** 90,100 **** return super.loadClass(name, resolve); } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { ! if (name.endsWith("$BaseLoggerFinder")) { return defineFinderClass(name); } return super.findClass(name); } --- 96,106 ---- return super.loadClass(name, resolve); } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { ! if (name.endsWith("BaseLoggerFinder") || name.startsWith("BaseLoggerFinder$")) { return defineFinderClass(name); } return super.findClass(name); }
< prev index next >