classloader简介

1 classloader层次结构(父子关系)

Bootstrap(ClassLoader)

  • ExtClassLoader

    • AppClassLoader

      • XXXClassLoader

详见代码如下:

sun.misc.Launcher
  1. public Launcher() {
  2.  
  3. Launcher.ExtClassLoader var1;
  4.  
  5. try {
  6.  
  7. var1 = Launcher.ExtClassLoader.getExtClassLoader();
  8.  
  9. } catch (IOException var10) {
  10.  
  11. throw new InternalError("Could not create extension class loader", var10);
  12.  
  13. }
  14.  
  15. try {
  16.  
  17. this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
  18.  
  19. } catch (IOException var9) {
  20.  
  21. throw new InternalError("Could not create application class loader", var9);
  22.  
  23. }

2 classloader加载类过程

classloader在加载class时优先尝试通过parent classloader加载,如果加载不到,才尝试自己加载,即常说的“双亲委派”,

并且如果一个class依赖其他class,比如ClassA依赖ClassB,ClassB默认由ClassA的classloader来加载。

* <p> The methods and constructors of objects created by a class loader may
* reference other classes. To determine the class(es) referred to, the Java
* virtual machine invokes the {@link #loadClass <tt>loadClass</tt>} method of
* the class loader that originally created the class.

详见代码如下:

java.lang.ClassLoader
  1. protected Class<?> loadClass(String name, boolean resolve)
  2.  
  3. throws ClassNotFoundException
  4.  
  5. {
  6.  
  7. synchronized (getClassLoadingLock(name)) {
  8.  
  9. // First, check if the class has already been loaded
  10.  
  11. Class<?> c = findLoadedClass(name);
  12.  
  13. if (c == null) {
  14.  
  15. long t0 = System.nanoTime();
  16.  
  17. try {
  18.  
  19. if (parent != null) {
  20.  
  21. c = parent.loadClass(name, false);
  22.  
  23. } else {
  24.  
  25. c = findBootstrapClassOrNull(name);
  26.  
  27. }
  28.  
  29. } catch (ClassNotFoundException e) {
  30.  
  31. // ClassNotFoundException thrown if class not found
  32.  
  33. // from the non-null parent class loader
  34.  
  35. }
  36.  
  37. if (c == null) {
  38.  
  39. // If still not found, then invoke findClass in order
  40.  
  41. // to find the class.
  42.  
  43. long t1 = System.nanoTime();
  44.  
  45. c = findClass(name);
  46.  
  47. // this is the defining class loader; record the stats
  48.  
  49. sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
  50.  
  51. sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
  52.  
  53. sun.misc.PerfCounter.getFindClasses().increment();
  54.  
  55. }
  56.  
  57. }
  58.  
  59. if (resolve) {
  60.  
  61. resolveClass(c);
  62.  
  63. }
  64.  
  65. return c;
  66.  
  67. }
  68.  
  69. }

【原创】Java基础之ClassLoader类加载器简介的更多相关文章

  1. 进阶Java编程(11)ClassLoader类加载器【待完成】

    1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...

  2. Java安全之 ClassLoader类加载器

    Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...

  3. Java URLClassLoader 和 ClassLoader类加载器

    开始:看名字都带有ClassLoader,叫做类加载器,事实上是可以理解为动态的加载类,不过,也不是只能加载类,也可以加载其他形式的文件,比如说.properties属性文件. 区别:其实在两个类加载 ...

  4. Java中对于ClassLoader类加载器 嵌套了深度技术的价值

    关于Java技术是一种不断兴起的编程语言,对于ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里.本文我带你彻底吃透 ClassLoader,让你甚 ...

  5. ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制

    ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...

  6. 【JAVAWEB学习笔记】25_基础加强:类加载器、注解 @xxx和动态代理

    基础加强 学习目标 案例-自定义单元测试@MyTest 案例-全局的编码的解决 一.类加载器 1.什么是类加载器,作用是什么? 类加载器就加载字节码文件(.class) 2.类加载器的种类 类加载器有 ...

  7. Java基础-二进制以及字符编码简介

    Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...

  8. Java基础-日期格式化DateFormat类简介

    Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...

  9. 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..

    1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...

随机推荐

  1. 自己动手,打造轻量级VSCode/C#环境代替LinqPad

    .Net 的项目都挺重的,一直想找一个轻量级的 CSharp 环境,能像Python那样,选一个文件就能跑的.之前用的是 LinqPad,但它的缺点也很明显: (1)     不付费,自动完成不能用( ...

  2. jeecg字典表—普通表

    创建普通表 同步数据库(创建对应的表) 验证功能效果 添加用户表,并添加对应的级别属性 同步用户表 字典功能测试 然后生成最新代码,添加到菜单即可

  3. day02(编程语言,解释器,环境变量,执行方式,pycharm,pip,变量三大组成)

      上节课复习: 重点: 1,进制转换:二进制与十六进制 2,内存分布:栈区 与 堆区 10101001110111 => 2a77 abf1 => 1010101111110001 计算 ...

  4. Zookeeper连接eclipse

    package com.bw.ZK; import java.io.IOException; import org.apache.zookeeper.CreateMode; import org.ap ...

  5. 使用css画一个箭头

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. 异常SRVE0199E

    后台生成导出exe表格,在tomcat自己环境下完全没问题到websphere环境下保SRVE0199E产生这个问题是因为response.OutputStream已经打开再次打开就报这个异常,前台如 ...

  7. 修改host,上github

    操作如下: 1.http://ping.chinaz.com/ 搜索github.com 海外ip,其实能找到的就两个;然后再搜gist.github.com 海外ip,也是两个. 192.30.25 ...

  8. python之装饰器初识

    一.@abstractmethod 1.抽象类的作用:规范编程模式 多人开发.复杂的需求.后期的扩展 是一种用来帮助我们完成规范化的手段 2.如何定义抽象类 1,from abc import ABC ...

  9. Java爬取12306余票

    一.前言 今年国庆和中秋一起放,虽然很欢快,但是没有票了!!! 于是自己倒腾了一个查询余票的小程序. 二.准备工作 1.先打开12306的页面 2.然后右键检查,点network 3.再点一下1230 ...

  10. HDU6278 Just h-index

    主席树+二分 每次对给定区间从1-区间长度len二分mid,查询区间内第mid大的数是不是大于等于mid.. #include <bits/stdc++.h> #define INF 0x ...