自定义ClassLoader类

来源:互联网 发布:宏观经济数据库设计 编辑:程序博客网 时间:2024/06/05 07:31

1.MyClassLoader.java:

package com.buaa.classLoader;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class MyClassLoader extends ClassLoader{private String pathDir;public MyClassLoader(String pathDir){this.pathDir = pathDir;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {//查找是否已经被加载过,加载过直接返回,没有加载的话,交给父类去加载。Class<?> c = this.findLoadedClass(name);if(c!=null){return c;} else {ClassLoader loader = this.getParent();try {c = loader.loadClass(name);} catch (Exception e) {}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 classname){String path = pathDir + "/" + classname.replace('.', '/') + ".class";InputStream in = null;ByteArrayOutputStream bao = new ByteArrayOutputStream();try{in = new FileInputStream(path);byte[] buffer = new byte[1024];int temp = 0;while((temp=in.read(buffer))!=-1){bao.write(buffer,0,temp);bao.flush();}return bao.toByteArray();} catch(Exception e) {e.printStackTrace();return null;} finally {if(bao!=null){try {bao.close();} catch (IOException e) {e.printStackTrace();}bao = null;}if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}in = null;}}}}
2.测试类:

package com.buaa.classLoader;public class Demo01 {public static void main(String[] args) throws Exception {MyClassLoader myLoader = new MyClassLoader("e:/zzzjava");MyClassLoader myLoader2 =new MyClassLoader("e:/zzzjava");Class<?> clazz = myLoader.loadClass("com.buaa.javassist.Person");Class<?> clazz2 = myLoader.loadClass("com.buaa.javassist.Person");Class<?> clazz3 = myLoader2.loadClass("com.buaa.javassist.Person");Class<?> clazz4 = myLoader.loadClass("java.lang.String");Class<?> clazz5 = myLoader2.loadClass("java.lang.String");Class<?> clazz6 = myLoader2.loadClass("com.buaa.classLoader.Demo01");System.out.println(clazz.hashCode());//加载e:/zzzjava下的Person类System.out.println(clazz2.hashCode());System.out.println(clazz3.hashCode());//相同的类,不同加载器,返回的类不是同一个类System.out.println(clazz4);//双亲委托,由父类加载System.out.println(clazz5.getClassLoader());//String类是由ClassLoader类加载的,它没有父类,返回值是空。System.out.println(clazz6.getClassLoader());//加载工作空间的类,是由AppClassLoader加载的System.out.println(clazz3.getClassLoader());}}

3.输出结果为:

/** * 输出结果为: * 1363753365 * 1363753365 * 509841124 * class java.lang.String * null * sun.misc.Launcher$AppClassLoader@19a40cfc * com.buaa.classLoader.MyClassLoader@24367013 *  */



0 0
原创粉丝点击