要实现类的热部署可以创建不同的ClassLoader的实例对象,然后通过这个不同的实例对象来加载相同的类。
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ClassReloader extends ClassLoader {
private String classPath;
String classname="character7.OverLoad";
public ClassReloader(String classPath){
this.classPath=classPath;
}
protected Class<?> findClass(String name) throws ClassNotFoundException{
byte[] classData=getData(name);
if(classData==null){
throw new ClassNotFoundException();
}else{
return defineClass(classname,classData,0,classData.length);
}
}
private byte[] getData(String className){
String path=classPath+className;
try {
InputStream is=new FileInputStream(path);
ByteArrayOutputStream stream=new ByteArrayOutputStream();
byte[] buffer=new byte[2048];
int num=0;
while((num=is.read(buffer))!=-1){
stream.write(buffer, 0, num);
}
return stream.toByteArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String path="E:/eclipseworkspace/JVM/bin/character7/";
try {
ClassReloader reloader=new ClassReloader(path);
Class r=reloader.findClass("OverLoad.class");
System.out.println(r.newInstance());
ClassReloader reloader2=new ClassReloader(path);
Class r2=reloader2.findClass("OverLoad.class");
System.out.println(r2.newInstance());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}