package org.zbus.client.service; import java.net.URL; import java.net.URLClassLoader; public class ContainerClassLoader extends ClassLoader { private ChildClassLoader childClassLoader; public ContainerClassLoader(URL[] urls) { super(Thread.currentThread().getContextClassLoader()); childClassLoader = new ChildClassLoader(urls, new DetectClass( this.getParent())); } @Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { try { if(name.startsWith("org.zbus")){ //ZBUS shared return super.loadClass(name, resolve); } return childClassLoader.findClass(name); } catch (ClassNotFoundException e) { return super.loadClass(name, resolve); } } private class ChildClassLoader extends URLClassLoader { private DetectClass realParent; public ChildClassLoader(URL[] urls, DetectClass realParent) { super(urls, null); this.realParent = realParent; } @Override public Class<?> findClass(String name) throws ClassNotFoundException { try { Class<?> loaded = super.findLoadedClass(name); if (loaded != null) return loaded; return super.findClass(name); } catch (ClassNotFoundException e) { return realParent.loadClass(name); } } } private class DetectClass extends ClassLoader { public DetectClass(ClassLoader parent) { super(parent); } @Override public Class<?> findClass(String name) throws ClassNotFoundException { return super.findClass(name); } } }