自定义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
- 自定义ClassLoader类
- 自定义类加载器ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 详解ClassLoader加载类的流程及自定义ClassLoader
- Java_ClassLoader(ClassLoader / 自定义ClassLoader / DexClassLoader)
- 自定义Classloader 加载类---Eclipse plugin开发
- 一个自定义类加载器ClassLoader示例
- 实现自定义类加载器-ClassLoader
- 自定义类加载器(ClassLoader + URLClassLoader)
- Classloader 二 自定义类加载器
- 多线程的基本模型
- POJ 3069 Saruman's Army(贪心、思维)
- SpringMVC入门
- SiteWhere物联网云平台介绍
- CSS简介
- 自定义ClassLoader类
- 开始重温或者学习((-__-)b)算法
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
- linux源代码目录结构
- 写在博客之路开始之前
- 用java编写一个菱形与空心菱形
- C/C++防止内存泄漏的几种措施
- 微观SOA:服务设计原则及其实践方式
- J2EE专题之经典书籍篇