类加载器和类加载机制

一 点睛

1 类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象。

2 当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:

Bootstrap ClassLoader:根类加载器。

Extension ClassLoader:扩展类加载器。

System ClassLoader:系统类加载器。

3 JVM的类加载机制主要有如下三种机制:

全盘负责:所谓全盘负责,就是说当一个类加载器负责加载某个Class的时候,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显式使用另外一个类加载器来载入。

父类委托:所谓父类委托则是先让parent(父)类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。

缓存机制:缓存机制将会保证所有被加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存中搜寻该Class,只有当缓存中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,并存入cache。这就是为什么我们修改了Class后,程序必须重新启动JVM,程序所作的修改才会生效的原因。

二 实战

1 代码

import java.net.*;

public class BootstrapTest
{
   public static void main(String[] args)
   {
      // 获取根类加载器所加载的全部URL数组
      URL[] urls = sun.misc.Launcher.
            getBootstrapClassPath().getURLs();
      // 遍历、输出根类加载器加载的全部URL
      for (int i = 0; i < urls.length; i++)
      {
         System.out.println(urls[i].toExternalForm());
      }
   }
}

2 运行

file:/D:/Program/Java/jdk1.8.0_162/jre/lib/resources.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/rt.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/sunrsasign.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jsse.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jce.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/charsets.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/lib/jfr.jar
file:/D:/Program/Java/jdk1.8.0_162/jre/classes

三 实战

1 代码

import java.util.*;
import java.net.*;
import java.io.*;

public class ClassLoaderPropTest
{
   public static void main(String[] args)
         throws IOException
   {
      // 获取系统类加载器
      ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
      System.out.println("系统类加载器:" + systemLoader);
      /*
      获取系统类加载器的加载路径——通常由CLASSPATH环境变量指定
      如果操作系统没有指定CLASSPATH环境变量,默认以当前路径作为
      系统类加载器的加载路径
      */
      Enumeration<URL> em1 = systemLoader.getResources("");
      while(em1.hasMoreElements())
      {
         System.out.println(em1.nextElement());
      }
      // 获取系统类加载器的父类加载器:得到扩展类加载器
      ClassLoader extensionLader = systemLoader.getParent();
      System.out.println("扩展类加载器:" + extensionLader);
      System.out.println("扩展类加载器的加载路径:"
            + System.getProperty("java.ext.dirs"));
      System.out.println("扩展类加载器的parent: "
            + extensionLader.getParent());
   }
}

2 运行

系统类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
file:/E:/Java/IDEA_Java/out/production/IDEA_Java/
扩展类加载器:sun.misc.Launcher$ExtClassLoader@14ae5a5
扩展类加载器的加载路径:D:\Program\Java\jdk1.8.0_162\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
扩展类加载器的parent: null

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值