/** * */ package org.apache.smscserver.server.main.impl; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * A Classloader that traverses both libs and modules to load classes. * * @author hceylan * * */ public class DualClassLoader extends ClassLoader { private final LibsClassLoader libsClassLoader; private final List<ClassLoader> moduleClassLoaders; public DualClassLoader(ClassLoader parent, String spHome) { super(parent); this.libsClassLoader = new LibsClassLoader(spHome, this); this.moduleClassLoaders = new ArrayList<ClassLoader>(); } /** * Adds a module to the classloader. * * @param classLoader * the classloader of the module */ public void addModuleClassLoader(ClassLoader classLoader) { this.moduleClassLoaders.add(classLoader); } /** * {@inheritDoc} * */ @Override protected Class<?> findClass(String name) throws ClassNotFoundException { Class<?> c = null; try { c = this.libsClassLoader.findClass(name); if (c != null) { return c; } } catch (ClassNotFoundException e) { } for (ClassLoader classLoader : this.moduleClassLoaders) { try { Class<? extends ClassLoader> clazz = classLoader.getClass(); Method method = clazz.getMethod("findClass", String.class); method.setAccessible(true); c = (Class<?>) method.invoke(classLoader, name); if (c != null) { return c; } } catch (Exception e) { } } throw new ClassNotFoundException(); } /** * {@inheritDoc} * */ @Override protected URL findResource(String name) { URL url = null; url = this.libsClassLoader.findResource(name); if (url != null) { return url; } for (ClassLoader classLoader : this.moduleClassLoaders) { try { Method method = classLoader.getClass().getMethod("findResource", String.class); method.setAccessible(true); url = (URL) method.invoke(classLoader, name); if (url != null) { return url; } } catch (Exception e) { } } return null; } public LibsClassLoader getLibsClassLoader() { return this.libsClassLoader; } }