summaryrefslogtreecommitdiffstats
path: root/sandbox/slaws/classloader/src/main/java/cl/CustomClassLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/slaws/classloader/src/main/java/cl/CustomClassLoader.java')
-rw-r--r--sandbox/slaws/classloader/src/main/java/cl/CustomClassLoader.java83
1 files changed, 83 insertions, 0 deletions
diff --git a/sandbox/slaws/classloader/src/main/java/cl/CustomClassLoader.java b/sandbox/slaws/classloader/src/main/java/cl/CustomClassLoader.java
new file mode 100644
index 0000000000..050b770eab
--- /dev/null
+++ b/sandbox/slaws/classloader/src/main/java/cl/CustomClassLoader.java
@@ -0,0 +1,83 @@
+package cl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+public class CustomClassLoader extends ClassLoader
+{
+ public CustomClassLoader(){
+ super(CustomClassLoader.class.getClassLoader());
+ }
+
+ public Class loadClass( String name, boolean resolve )
+ throws ClassNotFoundException {
+ // Our goal is to get a Class object
+ Class clazz = null;
+
+ // First, see if we've already dealt with this one
+ clazz = findLoadedClass(name);
+
+ String fileStub = name.replace( '.', '/' );
+ String classFilename = "target/classes/" + fileStub+".class";
+
+ try {
+ // read the bytes
+ byte raw[] = getBytes( classFilename );
+ // try to turn them into a class
+ clazz = defineClass( name, raw, 0, raw.length );
+ } catch( IOException ex ) {
+ // This is not a failure! If we reach here, it might
+ // mean that we are dealing with a class in a library,
+ // such as java.lang.Object
+ }
+
+ // Maybe the class is in a library -- try loading
+ // the normal way
+ if (clazz==null) {
+ clazz = findSystemClass( name );
+ }
+
+ // Resolve the class, if any, but only if the "resolve"
+ // flag is set to true
+ if (resolve && clazz != null) {
+ resolveClass( clazz );
+ }
+
+ // If we still don't have a class, it's an error
+ if (clazz == null) {
+ throw new ClassNotFoundException( name );
+ }
+
+ return clazz;
+ }
+
+ // Given a filename, read the entirety of that file from disk
+ // and return it as a byte array.
+ private byte[] getBytes( String filename ) throws IOException {
+ // Find out the length of the file
+ File file = new File( filename );
+ long len = file.length();
+
+ // Create an array that's just the right size for the file's
+ // contents
+ byte raw[] = new byte[(int)len];
+
+ // Open the file
+ FileInputStream fin = new FileInputStream( file );
+
+ // Read all of it into the array; if we don't get all,
+ // then it's an error.
+ int r = fin.read( raw );
+
+ if (r != len) {
+ throw new IOException( "Can't read all, "+r+" != "+len );
+ }
+
+ // Don't forget to close the file!
+ fin.close();
+
+ // And finally return the file contents as an array
+ return raw;
+ }
+}