类加载器

1 package com.itheima.classloader; java.io.BufferedInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.lang.reflect.Constructor;MyClassLoader extends ClassLoader {main(String[] args) throws Exception {Class<?> clazz = new MyClassLoader(“ClassLoaderLib”).loadClass(“Person”);Constructor<?> con = clazz.getConstructor(String.class, int.class);Object obj = con.newInstance(“张三”,15);System.out.println(obj.getClass().getClassLoader()); 19 } String classDir;* 复写findClass方法 26 * 因为自定义的类加载器MyClassLoader继承了ClassLoader类,继承了其所有方法 27 * 通过loadClass(String name)方法加载类的时候: 28 * 1、会检查该类是否已经加载,如果没有,会依次委托MyClassLoader的父类、父类的父类 29 * 等类加载器依次尝试加载,都失败则执行findClass(String name)试图获取待加载的类的Class对象 30 * 2、而ClassLoader中findClass(String name)方法直接抛出ClassNotFoundException(name) 31 * 3、因此复写findClass(String name)方法就是以自定义的方式获取类(在父类都无法加载的情况) 32 * 4、通过将某个.class文件读入一个byte类型的数组中,然后通过defineClass方法 33 * 获取该字节码文件(Class对象)并返回 34 * 5、因此,当1中的情况出现时,,本类即可通过findClass(String name)获取Class对象给 35 * loadClass(String name)方法,使其返回同一个Class对象 36 * 37 * 本类主函数内: 38 * new MyClassLoader(“ClassLoaderLib”).loadClass(“Person”); 39 * new MyClassLoader(“ClassLoaderLib”).findClass(“Person”); 40 * 41 * 因为protected权限修饰符,其他类调用本类加载某个类只能用loadClass方法 42 * @Override 45protected Class<?> findClass(String name) throws ClassNotFoundException {String classPath = classDir + “\\” + name + “.class”;Class<?> clazz = null;BufferedInputStream bos = null;ByteArrayOutputStream baos = null; 54try {bos = new BufferedInputStream(new FileInputStream(classPath)); [] buf = new byte[1024]; 59int len = -1;baos = new ByteArrayOutputStream();((len = bos.read(buf)) != -1) { 64baos.write(buf, 0, len); 65 }[] bytes = baos.toByteArray();clazz = defineClass(null, bytes, 0, bytes.length); 70} catch (IOException e) {e.printStackTrace();} finally { 75try { 76if (bos != null) { 77 bos.close(); 78 } 79} catch (IOException e) {e.printStackTrace(); 82 } 83try { 84if (baos != null) { 85 baos.close(); 86 } 87} catch (IOException e) {e.printStackTrace(); 90 } 91 }(clazz == null) {RuntimeException(“类不存在”); 95} else { 96return clazz; 97 } 98 99 }* 构造函数传递待加载类所在的目录 classDir 待加载的类所在的目录 MyClassLoader(String classDir) {105this.classDir = classDir;106 }107 108 }一个人行走,若是寂寞了,寻一座霓虹灯迷离闪烁,

类加载器

相关文章:

你感兴趣的文章:

标签云: