
com.avaje.ebean.enhance.agent.LocalClassLoader Maven / Gradle / Ivy
package com.avaje.ebean.enhance.agent;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
/**
* This class loader is used to load any classes (typically super classes)
* during enhancement process (avoiding the application class loaders).
*/
public class LocalClassLoader extends URLClassLoader {
public LocalClassLoader(URL[] urls, ClassLoader loader) {
super(urls, loader);
}
protected synchronized Class loadClass(String name, boolean resolve)
throws ClassNotFoundException {
if (name.startsWith("java.")) {
// we cannot reload these classes due to security constraints
return super.loadClass(name, resolve);
}
Class c = super.findLoadedClass(name);
if (c != null) {
return c;
}
String resource = name.replace('.', '/') + ".class";
try {
// read the class bytes, and define the class
URL url = super.getResource(resource);
if (url == null) {
throw new ClassNotFoundException(name);
}
File f = new File("build/bin/"+resource);
System.out.println("FileLen:"+f.length()+" "+f.getName());
InputStream is = url.openStream();
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] b = new byte[2048];
int count;
while ((count = is.read(b, 0, 2048)) != -1) {
os.write(b, 0, count);
}
byte[] bytes = os.toByteArray();
System.err.println("bytes: "+bytes.length+" "+resource);
return defineClass(name, bytes, 0, bytes.length);
} finally {
if (is != null) {
is.close();
}
}
} catch (SecurityException e) {
return super.loadClass(name, resolve);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
}