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
- Java中自定义类加载器(双亲委派机制)
- Java--双亲委派机制&类加载机制
- Java类加载器与双亲委派机制
- java类加载器以及双亲委派机制
- Java自定义类加载器与双亲委派模型
- 类加载器和双亲委派机制
- 类加载器、双亲委派机制
- 深入理解Java类加载机制(2)--类加载器及双亲委派模型
- Java类加载器双亲委派模型
- java类加载器,双亲委派模型
- Java类加载器--双亲委派模型
- Java类加载双亲委派机制的一点思考
- java jvm 类加载机制 双亲委派模型
- 类加载器子系统的类加载机制(双亲委派机制)
- 类加载器的双亲委派及打破双亲委派
- 十一、类加载器及双亲委派机制
- JVM中的类加载器与双亲委派机制
- 理解jvm类加载机制(双亲委派模型)
- SpringMVC中的@RequestMapping注解中的@PathVariable注解
- Regex—匹配特定数字前面的一个单词
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(二)
- selenium启动Firefox示例
- JavaScript中如何将html字符串转化为Jquery对象或者Dom对象
- Java中自定义类加载器(双亲委派机制)
- Sumsets(规律题)
- react入门之使用react-bootstrap当轮子造车(二)
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(三)
- selenium定位元素常用的8种方法整理
- Android经典面试题(2017)
- MySQL索引入门
- Android中MAT、GIMP查看哪些图片占用了内存
- 欢迎使用CSDN-markdown编辑器