自定义ClassLoader

ClassLoader再java中十分重要,它主要是在Class装载的加载阶段,将系统外部的获得Class二进制数据流,载进系统,交给jvm进行连接、初始化等操作。代码如下

//这是我要加载的外部类
public class Stone { static { System.out.println("i am a stone and very hard!!!"); } }

  

这是继承ClassLoader类之后重写其findclass,并返回其defineClass,实现自动ClassLoader
public class MyclassLoader extends ClassLoader { //读取路径 private String path; //读取名称 private String classLoaderName; public MyclassLoader(String path, String classLoaderName) { this.path = path; this.classLoaderName = classLoaderName; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { name = path + name + ".class"; InputStream in = null; ByteArrayOutputStream out = null; try { //读文件 in = new FileInputStream(new File(name)); //接受文件 out = new ByteArrayOutputStream(); //设置起始位置 int i = 0; //循环读入 while ((i = in.read()) != -1) { out.write(i); } return out.toByteArray(); } catch (Exception e) { e.getStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } //返回二进制字节流 return null; } }

  

这是最终的检测,验证代码
public class ClassLoaderChecker { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { MyclassLoader myclassLoader = new MyclassLoader("D:\\redis\\","ccloader"); Class<?> stone = myclassLoader.loadClass("Stone"); System.out.println(stone.getClassLoader()+"- _ -"); stone.newInstance(); } }

  理解原理,然后注意系统外部文件的存放位置,使用前需要在idea中编译,或者自行手动javac命令编译。

posted @ 2019-12-01 11:08  Kill(Bug)  阅读(53)  评论(0)    收藏  举报