目录

第一节 概述

1.类加载的分类

2. 类加载器的必要性

3. 命名空间

4. 类加载机制的基本特征

第二节 类的加载器分类

概述

1. 引导类加载器

2. 扩展类加载器

3. 系统类加载器

4. 用户自定义类加载器

第三节 测试不同的类加载器

第四节 ClassLoader 源码解析

1. ClassLoader 的主要方法

2. SecureClassLoader 与 与 URLClassLoader

3. ExtClassLoader 与 与 AppClassLoader

4. Class.forName() 与 与 ClassLoader.loadClass()

第五节 双亲委派模型

1. 定义与本质

2. 优势与劣势

3. 破坏双亲委派机制

第六节 自定义类加载器及热替换的实现


第一节 概述

1.类加载的分类

2. 类加载器的必要性

3. 命名空间

4. 类加载机制的基本特征

第二节 类的加载器分类

概述

class ClassLoader {ClassLoader parent; //父类加载器public ClassLoader(ClassLoader parent) {this.parent = parent;}
}class ParentClassLoader extends ClassLoader {public ParentClassLoader(ClassLoader parent) {super(parent);}
}class ChildClassLoader extends ClassLoader {public ChildClassLoader(ClassLoader parent) {//parent = new ParentClassLoader();super(parent);}
}

1. 引导类加载器

  • 注意:第五条那个父类加载器的意思并不是指继承,是一个上层的关系,前面有讲到。
  • 引导类加载器是获取不到的,C/C++实现的

2. 扩展类加载器

3. 系统类加载器

4. 用户自定义类加载器

第三节 测试不同的类加载器

这个java.lang.String就是空,因为java包下的是用bootstrap

第四节 ClassLoader 源码解析

1. ClassLoader 的主要方法

protected Class<?> loadClass(String name, boolean resolve) //resolve:true 加载 Class 的同
时进行解析操作
throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) { //同步操作,保证只能加载一次// 首先,在缓存中判断是否已经加载同名类// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// 获取当前类加载类的父类加载器if (parent != null) {// 如果存在父类加载器,则调用父类加载器进行类加载c = parent.loadClass(name, false);} else { // parent 为 null :父类加载器是引导类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) { // 当前类的加载器的父类加载未加载其此类 or 当前类的加载器未加载此类// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statsPerfCounter.getParentDelegationTime().addTime(t1 - t0);PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);PerfCounter.getFindClasses().increment();}}if (resolve) {//是否进行解析操作resolveClass(c);}return c;}
}

2. SecureClassLoader 与 与 URLClassLoader

3. ExtClassLoader 与 与 AppClassLoader

4. Class.forName() 与 与 ClassLoader.loadClass()

第五节 双亲委派模型

1. 定义与本质

2. 优势与劣势

3. 破坏双亲委派机制

第六节 自定义类加载器及热替换的实现

  • 自定义类加载器
public class MyClassLoader extends ClassLoader {private String classPath;//字节码路径public MyClassLoader(String classPath){this.classPath = classPath;}/*重写此方法不会破坏双亲委派机制*/@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException{String fileName = classPath + "/" + name + ".class";BufferedInputStream bis = null;try {bis = new BufferedInputStream(new FileInputStream(fileName));//用一个流去读取.class文件} catch (FileNotFoundException e) {
//            e.printStackTrace();}//字节数组输出流ByteArrayOutputStream baos = new ByteArrayOutputStream();int len;byte[] data = new byte[1024];try {//将class文件输出到字节数组输出流while (bis != null && (len = bis.read(data)) != -1){baos.write(data,0,len);}if (bis == null) return null;byte[] byteCodes = baos.toByteArray();bis.close();baos.close();//调用本地的加载方法return defineClass(null,byteCodes,0,byteCodes.length);}catch (IOException e){}return null;}}
  • UserService类
public class UserService {public void save(){System.out.println("好撒旦撒啊好啊");}
}
  • 测试类及具体实现
public class MyClassLoaderTest {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException {//.class文件的路径,这里就是out文件夹的路径String classPath = "D:\\buildproject\\jvm-study\\out\\production\\jvm-01\\com\\vuhen\\jvmIn\\study08";Thread thread = new Thread(new MyThread(classPath));//不断创建自定义类加载器类实例的线程,实现热部署thread.start();}
}
class MyThread implements Runnable{private String classPath;public MyThread(String classPath) {this.classPath = classPath;}@Overridepublic void run() {while (true){try {//自定义类加载器MyClassLoader classLoader = new MyClassLoader(classPath);//加载类字节码文件Class clazz1 = classLoader.loadClass("UserService");if (clazz1 == null) continue;//创建实例对象Object userService = clazz1.newInstance();//获取save方法Method method = clazz1.getDeclaredMethod("save");//调用方法method.invoke(userService);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

java学习笔记-类的加载器相关推荐

  1. amba simple class驱动_学习笔记:class加载器和双亲委派模型

    类加载器 类加载器有四种 启动类加载器(Bootstrap ClassLoader) 负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可( ...

  2. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  3. java 内部类 加载_举例讲解Java的内部类与类的加载器

    内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加 ...

  4. Day18 (一)类的加载器

    一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这个虚拟机实例也就随之消亡. 如果在同一台计算机上同时运行多个Java程序 ...

  5. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

  6. 如何使用示例从Java中的类路径加载资源

    Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...

  7. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

    java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...

  8. 类的加载器的介绍 和 类的加载过程

    java的3大加载器 引导类加载器 BootStrapClassLoader 扩展类加载器 ExtensionClassLoader 应用程序类加载器 ApplicationClassLoader 三 ...

  9. WEB——BaseDao、注解、Servlet3.0、动态代理、类的加载器

    **编写BaseDao**          1.dao持久层怎么来写的?     2.编写通用的BaseDao,其他的Dao的持久层继承BaseDao,提供增删改查的方法了.          3. ...

最新文章

  1. qDebug 的用法
  2. java 启动 jetty_如何通过命令行启动或者关闭 Jetty 服务器
  3. Response 输出文件流过程中的等待效果
  4. linux注册平台驱动,关于Linux驱动的平台注册方式-- platform_driver_register
  5. 【C++ STL学习之四】容器list深入学习
  6. easypoi 导入oracle,记一次由openjdk导致的poi错误(easyexcel)
  7. [USACO13DEC]牛奶调度Milk Scheduling
  8. 化工企业数据分析平台项目之应收款分析
  9. Java基础之字符串详细比较
  10. 我买的开发板——大虾网DX32(for STM32)
  11. 四个球队,单循环比赛,平局每队各得一分,胜利得3分,输不得分,最后各队得分是连续的四个自然数,求第二名的得分...
  12. 连接池原理解读,各个连接池对比
  13. 数据分析师的职业发展路径是怎样的?
  14. 奥斯汀页眉怎么设置_wps怎么只删除本页的页眉_Word页眉的设置和删除,这些问题你有遇到过吗?...
  15. React 事件处理
  16. 设置U盘盘符为自定义图片
  17. 【AE扩展插件问题解决记录】
  18. Html .CSS JQUERY (magnifier)实现详情页面特效
  19. webgame qlj
  20. iOS - 动态库上架瘦身(去调虚拟机架构),不然验证会报错。

热门文章

  1. Android小视频录制技术实现
  2. IT 入职感言 模板
  3. 青年是什么?请读一下塞缪尔·厄尔曼的《青春》
  4. Echarts通过svg画扇形例子,含矩形、三角形等
  5. 2023web安全测试最全学习路线,从入门到入职(含书籍、工具包)
  6. DHCP服务及与DHCP中继详解
  7. 面试宝典之实用测试技术
  8. 压测工具之JMeter在Mac下的安装
  9. 前端每日实战:119# 视频演示如何用纯 CSS 创作一个接扎啤的动画(内含2个视频)...
  10. 【头歌】 标准ACL配置