Java中自定义类加载器(双亲委派机制)

来源:互联网 发布:物流网络平台 编辑:程序博客网 时间:2024/05/16 05:08

同一个类,被不同的加载器加载,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;}@Overrideprotected 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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());//引导类加载器}}


阅读全文
0 0