自定义类加载器

    xiaoxiao2024-04-21  8

    package com.zkn.newlearn.classloader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; /** * * @author zkn * */ public class ClassLoaderTest01 extends ClassLoader { /** * 路径 */ private String path = ""; /** * 后缀名 */ private String className = ".class"; private String name = ""; private ClassLoader loader = null; @Override protected Class<?> findClass(String name) { byte[] b =loadClassData(name); if(b != null && b.length > 0) return defineClass(name, b, 0, b.length);   return this.getClass(); } @SuppressWarnings("null") private byte[] loadClassData(String names) { names = names.replace(".", "\\"); String clazzName = path + names + className; InputStream is = null; ByteArrayOutputStream baos = null; byte[] bytes = new byte[0]; int i = 0; try{ is = new FileInputStream(new File(clazzName)); baos = new ByteArrayOutputStream(); while(-1!=(i = is.read())){ baos.write(i); } bytes = baos.toByteArray(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(is != null) is.close(); if(baos != null) baos.close(); }catch(Exception ee){ ee.printStackTrace(); } } return bytes; } public ClassLoaderTest01(String name) { super(); this.name = name; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return " "+name; } public ClassLoaderTest01(String name, ClassLoader loader) { super(loader); this.name = name; this.loader = loader; } public static void main(String[] args) throws Exception{ ClassLoaderTest01 loader1 = new ClassLoaderTest01("loader1"); loader1.setPath("D:\\log4j\\sys\\"); ClassLoaderTest01 loader2 = new ClassLoaderTest01("loader2",loader1); loader2.setPath("D:\\log4j\\common\\"); ClassLoaderTest01 loader3 = new ClassLoaderTest01("loader3",null); loader3.setPath("D:\\log4j\\common\\"); try{ test(loader2,"com.zkn.newlearn.classloader.Parent"); }catch(Exception e){ loader2 = new ClassLoaderTest01("loader02"); loader2.setPath("D:\\log4j\\common\\"); test(loader2,"com.zkn.newlearn.classloader.Parent"); } test(loader3,"com.zkn.newlearn.classloader.Parent"); } private static void test(ClassLoader loader,String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class clazz = null; try{ clazz = loader.loadClass(name); }catch(Exception e){ e.printStackTrace(); } clazz.newInstance(); } }   package com.zkn.newlearn.classloader; /** * * @author zkn * */ public class Parent { public static int i = 1; public Parent(){ new Dog(); System.out.println("Parent类加载器为:"+Parent.class.getClassLoader()); } }   package com.zkn.newlearn.classloader; /** * * @author pc * */ public class Dog { public Dog(){ System.out.println("Dog 类 : 类加载器为--"+ Dog.class.getClassLoader()); } }   ClassLoaderTest01在sys下面: 1、如果Parent类在common下面,由子类加载,即loader2来加载。 <img src="https://img-blog.csdn.net/20160122230640800?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 2、如果Parent类在sys下面 由父类加载器加载,即loader1来加载。 <img src="https://img-blog.csdn.net/20160122230703769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 如果Parent在系统目录下 <img src="https://img-blog.csdn.net/20160122230726426?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /> 对于loader3,无论Parent类在哪目录下,Parent类始终由loader3来加载。
    最新回复(0)