package org.hotswap.agent.plugin.proxy; import java.io.IOException; import java.io.InputStream; /** * * Tries to load classes by itself first. Tries the parent Classloader last. * * @author Erki Ehtla * */ public class ParentLastClassLoader extends ClassLoader { public static final String[] EXCLUDED_PACKAGES = new String[] { "java.", "javax.", "sun.", "oracle." }; public ParentLastClassLoader(ClassLoader parent) { super(parent); } @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { for (String excludedPackage : EXCLUDED_PACKAGES) { if (name.startsWith(excludedPackage)) return super.loadClass(name, resolve); } Class<?> clazz = loadClassFromThisClassLoader(name); if (clazz == null) return super.loadClass(name, resolve); if (resolve) { resolveClass(clazz); } return clazz; } protected Class<?> loadClassFromThisClassLoader(String name) throws ClassNotFoundException { Class<?> result = findLoadedClass(name); if (result != null) { return result; } byte[] bytes = readClass(name); if (bytes != null) { return defineClass(name, bytes, 0, bytes.length); } return null; } protected byte[] readClass(String name) throws ClassNotFoundException { InputStream is = getParent().getResourceAsStream(name.replace('.', '/') + ".class"); if (is == null) { return null; } try { return ProxyTransformationUtils.copyToByteArray(is); } catch (IOException ex) { throw new ClassNotFoundException("Could not read: " + name, ex); } } }