同一个类,被不同的加载器加载,jvm会认为也是不相同的类.
package tk.javazhangwei.test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/***
* 自定义文件系统加载器(采用双亲委派机制)
* @author zw
*
*/
public class FileSystenClassLoader extends ClassLoader {
private String rootDir;
public FileSystenClassLoader(String rootDir) {
super();
this.rootDir = rootDir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class<?> c =findLoadedClass(name);
//西安查询有没有加载过这个类。如果已经加载,则直接返回加载好的类。else加载新的类
if(c!=null) {
return c;
}else {
ClassLoader parent = this.getParent();
try {
c =parent.loadClass(name);//委派给父类加载
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
if(c!=null) {
return c;
}else {
byte[] classData =getClassData(name);
if(classData == null) {
throw new ClassNotFoundException();
}else {
c=defineClass(name, classData, 0, classData.length);
}
}
}
return c;
}
private byte[] getClassData(String name) {
String path = rootDir +"/"+name.replace(".", "/")+".class";
InputStream is = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
is = new FileInputStream(path);
byte[] data = new byte[1024];
int len=0;
while((len=is.read(data))!=-1) {
bos.write(data,0,len);
}
bos.flush();
bos.close();
is.close();
return bos.toByteArray();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
package tk.javazhangwei.test;
/***
* 测试自定义的FileSystemClassLoder
* @author zw
*
*/
public class Demo03 {
public static void main(String[] args) throws ClassNotFoundException {
FileSystenClassLoader fc = new FileSystenClassLoader("D:/mycode/test/");
Class c = fc.loadClass("tk.javazhangwei.HelloWorld");
FileSystenClassLoader fc1 = new FileSystenClassLoader("D:/mycode/test/");
Class c1 = fc1.loadClass("tk.javazhangwei.HelloWorld");
Class c2 = fc1.loadClass("java.lang.String");
System.out.println(c);
System.out.println(c.hashCode());
System.out.println(c1.hashCode());//同一个类,被不同的加载器加载,jvm会认为也是不相同的类
System.out.println(c.getClassLoader());//自定义加载器加载
System.out.println(c2.getClassLoader());//引导类加载器
}
}