//MyClassLoader
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
public class MyClassLoader extends ClassLoader {
private String fileName;
public MyClassLoader(String fileName) {
this.fileName = fileName;
}
@Override
protected Class<?> findClass(String className) {
Class clazz = this.findLoadedClass(className);
if (null == clazz) {
try{
String classFile = this.getClassFile(className);
FileInputStream fis = new FileInputStream(classFile);
FileChannel fileC = fis.getChannel();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableByteChannel outC = Channels.newChannel(baos);
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
while (true) {
int i = fileC.read(buffer);
if (i == 0 || i == -1) {
break;
}
buffer.flip();
outC.write(buffer);
buffer.clear();
}
fis.close();
byte[] bytes = baos.toByteArray();
clazz = defineClass(className, bytes, 0, bytes.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return clazz;
}
protected String getClassFile(String name) {
if(name == null && name.isEmpty())
return null;
StringBuilder sb = new StringBuilder();
sb.append(this.fileName).append(name).append('.').append("class");
return sb.toString();
}
}
//Worker
public class Worker {
public void doIt() {
System.out.println("I am a CEO.");
}
}
//HelloMain
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class HelloMain {
public static void main(String[] args) {
while (true) {
try {
MyClassLoader loader = new MyClassLoader("C:/Users/");
Class cls = loader.findClass("Worker");
Object demo = cls.newInstance();
Method m = demo.getClass().getMethod("doIt", new Class[] {});
m.invoke(demo, new Object[] {});
Thread.sleep(2000);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}