package org.zeroturnaround.javarebel.integration.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import org.zeroturnaround.javarebel.ClassResource; import org.zeroturnaround.javarebel.ClassResourceSource; import org.zeroturnaround.javarebel.LoggerFactory; import org.zeroturnaround.javarebel.support.FallbackClassResource; import org.zeroturnaround.javarebel.support.FileClassResource; import org.zeroturnaround.javarebel.support.JarClassResource; public class FindResourceClassResourceSource implements ClassResourceSource { private ClassLoader classloader; private static Method findResourceMethod; static { try { findResourceMethod = ClassLoader.class.getDeclaredMethod("findResource", new Class[] {String.class}); findResourceMethod.setAccessible(true); } catch (NoSuchMethodException e) { LoggerFactory.getInstance().errorEcho(e); } } public FindResourceClassResourceSource(ClassLoader classloader) { this.classloader = classloader; } public ClassResource getClassResource(String className) { // Most containers don't like when JavaRebel instruments their code if (className.startsWith("weblogic.") || className.startsWith("com.evermind.") || className.startsWith("oracle.") || className.startsWith("com.bea.") || className.startsWith("org.apache.jsp.")) return null; URL url; if (classloader instanceof URLClassLoader) url = ((URLClassLoader) classloader).findResource(className.replace('.', '/') + ".class"); else { try { url = (URL) findResourceMethod.invoke(classloader, new Object[] {className.replace('.', '/') + ".class"}); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e.getTargetException()); } } if (url == null) return null; LoggerFactory.getInstance().log("Found URL '" + url + "' for class '" + className + "'."); if (url.getProtocol().equals("file")) { return new FileClassResource(url); } else if (url.getProtocol().equals("jar") || url.getProtocol().equals("zip") || url.getProtocol().equals("code-source")) { return new JarClassResource(url); } else { return new FallbackClassResource(url); } } }