了解过ClassLoader的双亲委派机制后,我们知道一个类文件仅会在JVM中加载一次,那如果想动态编译代码怎么办,底层native方法我们是不方便重写的,所以每次加载时new一个ClassLoader即可。
相关代码实现如下:
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
public class DynamicClassLoader extends ClassLoader {
@Override
public Class<?> findClass(String name) throws ClassNotFoundException{
byte[] b = loadClassData(name);
if(b != null && b.length > 0){
return defineClass(name, b, 0, b.length);
}else{
throw new ClassNotFoundException("not find "+name);
}
}
private byte[] loadClassData(String name){
String path = DynamicCompiler.CLASS_PATH + name.replaceAll("\\.","/") + ".class";
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new FileInputStream(path);
out = new ByteArrayOutputStream();
int i;
while ((i = in.read()) != -1){
out.write(i);
}
return out.toByteArray();
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if(out != null){
out.close();
}
if(in != null){
in.close();
}
} catch