package com.atChina.jvm;import java.io.*;public class Test16 extends ClassLoader{private String classLoaderName;private String path;private String fileExtension = ".class";public Test16(String classLoaderName){super(); // 默认系统类加载器是自定义类加载器的父加载器this.classLoaderName = classLoaderName;}public Test16(ClassLoader parent, String classLoaderName){super(parent);// 为自定义类加载器定义父类加载器this.classLoaderName = classLoaderName;}// alt+insert 添加set,get方法快捷键public void setPath(String path) {this.path = path;}@Overrideprotected Class<?> findClass(String className){System.out.println("findClass.........");byte[] data = this.loadClassData(className);return this.defineClass(className, data, 0, data.length);}private byte[] loadClassData(String className){ByteArrayOutputStream baos = null;byte[] data = null;int ch ;FileInputStream fis = null;try {className = className.replace(".","\\");fis = new FileInputStream(new File(path + className+fileExtension));baos =  new ByteArrayOutputStream();while(-1 != (ch = fis.read())){baos.write(ch);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();}finally{try {fis.close();baos.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("loadClassData..........");  // sout+tab键 可以快速生成 System.out.println()代码return data;}public static void main(String[] args) throws Exception {Test16  t16 = new Test16("load1");//t16.setPath("F:\\myCode\\springBootCode\\IdeaProjects\\JvmTest\\out\\production\\JvmTest\\");t16.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz = t16.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object = clazz.newInstance();System.out.println(clazz.hashCode());System.out.println(object.getClass().getClassLoader());System.out.println("========================================");Test16  load2 = new Test16("load2");load2.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz2 = load2.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object2 = clazz2.newInstance();System.out.println(clazz2.hashCode());System.out.println(object2.getClass().getClassLoader());}}

将生成好的class文件拷贝到一个路径A下,然后从类路径下将类删除, 这时候,两个自定义类加载器同时加载路径A下的类,同名的类就会加载两次,因为两个类加载器就是两个不同的命名空间。

package com.atChina.jvm;import com.sun.org.apache.xpath.internal.SourceTree;import java.io.*;public class Test16 extends ClassLoader{private String classLoaderName;private String path;private String fileExtension = ".class";public Test16(String classLoaderName){super(); // 默认系统类加载器是自定义类加载器的父加载器this.classLoaderName = classLoaderName;}public Test16(ClassLoader parent, String classLoaderName){super(parent);// 为自定义类加载器定义父类加载器this.classLoaderName = classLoaderName;}// alt+insert 添加set,get方法快捷键public void setPath(String path) {this.path = path;}@Overrideprotected Class<?> findClass(String className){System.out.println("findClass.........");byte[] data = this.loadClassData(className);return this.defineClass(className, data, 0, data.length);}private byte[] loadClassData(String className){ByteArrayOutputStream baos = null;byte[] data = null;int ch ;FileInputStream fis = null;try {className = className.replace(".","\\");fis = new FileInputStream(new File(path + className+fileExtension));baos =  new ByteArrayOutputStream();while(-1 != (ch = fis.read())){baos.write(ch);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();}finally{try {fis.close();baos.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("loadClassData..........");  // sout+tab键 可以快速生成 System.out.println()代码return data;}public static void main(String[] args) throws Exception {Test16  load1 = new Test16("load1");//t16.setPath("F:\\myCode\\springBootCode\\IdeaProjects\\JvmTest\\out\\production\\JvmTest\\");load1.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz = load1.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object = clazz.newInstance();System.out.println(clazz.hashCode());System.out.println(object.getClass().getClassLoader());System.out.println(load1.getParent());System.out.println("========================================");Test16  load2 = new Test16(load1, "load2"); // 设置 load1为load2的父加载器load2.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz2 = load2.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object2 = clazz2.newInstance();System.out.println(clazz2.hashCode());System.out.println(object2.getClass().getClassLoader());System.out.println("========================================");Test16  load3 = new Test16("load3");load3.setPath("C:\\Users\\YSS\\Desktop\\");Class<?> clazz3 = load3.loadClass("com.atChina.jvm.Test");System.out.println("test...");Object object3 = clazz3.newInstance();System.out.println(clazz3.hashCode());System.out.println(object3.getClass().getClassLoader());System.out.println(load3.getParent());}}

jvm十三:类加载器命名空间相关推荐

  1. 【JVM】类加载器:双亲委派机制、沙箱安全机制

    · 双亲委派机制.沙箱安全机制是JVM中类加载器系统的相关术语 · 在这之前,应该先了解JVM类加载器系统的相关概念 一.类加载器基础知识 见下图1,java文件首先会被编译成class文件,clas ...

  2. JVM之类加载器ClassLoader

    JVM之类加载器ClassLoader 本文目录 JVM简介 类加载器解析 1. JVM简介 ①. JVM是运行在操作系统之上的,它与硬件没有直接的交互 ②. JVM体系结构概览 注: 2. 类装载器 ...

  3. jdk包含java语言核心的类_1.1 jvm核心类加载器--jdk源码剖析

    目录 前提: 运行环境 1. 类加载的过程 1.1 类加载器初始化的过程 1.2 类加载的过程 1.3 类的懒加载 2. jvm核心类加载器 3. 双亲委派机制 4. 自定义类加载器 5. tomca ...

  4. JVM——自定义类加载器

    0. 为什么需要自定义类加载器   网上的大部分自定义类加载器文章,几乎都是贴一段实现代码,然后分析一两句自定义ClassLoader的原理.但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚,因 ...

  5. 细说JVM(类加载器)

    一.类加载器的基本概念 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java ...

  6. jvm十一:类加载器双亲委托机制

    在双亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都且只有一个父加载器. package com.atChina.jvm;import sun.awt.Symb ...

  7. 深入理解JVM(6)——类加载器

    虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现 ...

  8. jvm类加载机制和类加载器_在JVM之下–类加载器

    jvm类加载机制和类加载器 在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关 ...

  9. 在JVM之下–类加载器

    在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略. 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关系,才能生产JRebel技术 ...

最新文章

  1. linux如何用vi编程,vi使用方法
  2. 如何用Git拉取远程分支代码
  3. mysql 查询姓张或者姓王_mysql查询练习
  4. 中国钢铁行业产量规模与十四五建设动态分析报告2022-2027年
  5. python教程:可变长参数(*args、**kwargs)、返回值(return)
  6. 机器学习基础-聚类算法-15
  7. 激活函数:sigmoid、Tanh、ReLU
  8. 1到10用递归c语言,为什么这个递归能输出1到10
  9. java数据类型转换和数组总结
  10. 模型压缩:模型量化打怪升级之路-工具篇
  11. promotion failed 和 Concurrent Mode Failure的区别
  12. 5G与IoT将成为IPv6强大驱动力
  13. 9. JavaScript 事件参考手册
  14. 【hadoop权威指南第四版】第四章hadoop的IO【笔记+代码】
  15. 80286微处理器和80386的优缺点
  16. 解决笔记本HDMI外接显示器没声音的问题
  17. 泰拉瑞亚服务器云存档文件夹,泰拉瑞亚服务器云存档文件
  18. 鸿蒙OS开发蜂鸣器播放《两只老虎》
  19. 本周最新文献速递20220327
  20. 华为手机忘了密码,怎样强制刷机呢?

热门文章

  1. Java(CS)请求分流
  2. 作为Web开发人员,我为什么喜欢Google Chrome浏览器
  3. glutSwapBuffers函数用法
  4. 265. To B 端 Web 页面上线前 checklist
  5. 百度AI实战营第二季:AI技术商业落地指南
  6. ROS的工作模式和ESXI网卡工作模式的关系
  7. linux下的打包与压缩
  8. Linux中的盘符问题
  9. Unity 中的协同程序
  10. 关于TXT转CHM的完整解决方式