Java类加载器和类加载机制实例分析

作者:cakincqm 时间:2021-07-18 03:32:26 

本文实例讲述了Java类加载器和类加载机制。分享给大家供大家参考,具体如下:

一 点睛

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

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

来源:https://blog.csdn.net/chengqiuming/article/details/94960425

标签:Java,类加载器,类加载机制
0
投稿

猜你喜欢

  • Java实现读取resources目录下的文件路径的九种方式

    2023-11-23 11:47:02
  • C#实现ini文件读写操作

    2022-02-26 11:01:19
  • 使用@SpringBootTest注解进行单元测试

    2021-09-27 04:02:04
  • 从"Show tabs"了解Android Input系统

    2023-12-21 05:20:49
  • C# 9.0新特性——扩展方法GetEnumerator支持foreach循环

    2021-08-27 22:38:09
  • MyBatisPlus深入探究映射匹配的兼容性

    2023-01-08 08:57:26
  • 基于Freemarker和xml实现Java导出word

    2022-07-11 23:15:12
  • C# Fiddler插件实现网站离线浏览功能

    2022-10-09 01:46:14
  • Java中的OkHttp使用教程

    2023-08-10 19:30:59
  • 关于Spring Cloud 本地属性覆盖的问题

    2021-09-17 09:26:42
  • Flutter自动路由插件auto_route使用详解

    2022-04-25 12:39:52
  • C#使用FolderBrowserDialog类实现选择打开文件夹方法详解

    2022-08-11 07:28:39
  • java分布式面试CAP分别代表含义分析

    2021-10-05 17:54:47
  • 实例探究Android应用编写时Fragment的生命周期问题

    2022-12-15 19:57:22
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    2022-05-07 14:38:17
  • IDEA 2022 中的Lombok 使用基础教程

    2023-04-09 21:57:09
  • 使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    2022-06-14 00:43:18
  • 谈谈Java类型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType

    2022-10-18 17:43:07
  • Kotlin类对象class初始化与使用

    2023-08-09 22:00:52
  • 图文详解Java中的序列化机制

    2021-06-15 12:11:49
  • asp之家 软件编程 m.aspxhome.com