75 lines
1.9 KiB
Java
75 lines
1.9 KiB
Java
package capturemanager.classes;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
*
|
|
* Simple custom class loader implementation
|
|
*
|
|
*/
|
|
public class CustomClassLoader extends ClassLoader {
|
|
|
|
/**
|
|
* The HashMap where the classes will be cached
|
|
*/
|
|
private Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
|
|
|
|
@Override
|
|
public String toString() {
|
|
return CustomClassLoader.class.getName();
|
|
}
|
|
|
|
@Override
|
|
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
|
|
|
if (classes.containsKey(name)) {
|
|
return classes.get(name);
|
|
}
|
|
|
|
byte[] classData;
|
|
|
|
try {
|
|
classData = loadClassData(name);
|
|
} catch (IOException e) {
|
|
throw new ClassNotFoundException("Class [" + name
|
|
+ "] could not be found", e);
|
|
}
|
|
|
|
Class<?> c = defineClass(name, classData, 0, classData.length);
|
|
resolveClass(c);
|
|
classes.put(name, c);
|
|
|
|
return c;
|
|
}
|
|
|
|
/**
|
|
* Load the class file into byte array
|
|
*
|
|
* @param name
|
|
* The name of the class e.g. com.codeslices.test.TestClass}
|
|
* @return The class file as byte array
|
|
* @throws IOException
|
|
*/
|
|
private byte[] loadClassData(String name) throws IOException {
|
|
BufferedInputStream in = new BufferedInputStream(
|
|
ClassLoader.getSystemResourceAsStream(name.replace(".", "/")
|
|
+ ".class"));
|
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
int i;
|
|
|
|
while ((i = in.read()) != -1) {
|
|
out.write(i);
|
|
}
|
|
|
|
in.close();
|
|
byte[] classData = out.toByteArray();
|
|
out.close();
|
|
|
|
return classData;
|
|
}
|
|
}
|