热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了Java类加载器和类加载机制,结合实例形式分析了java类加载器与类加载机制原理、实现方法及相关操作技巧,需要的朋友可以参考下

本文实例讲述了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 

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 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程序设计有所帮助。


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 介绍一个提供正版Windows软件下载的权威网站,确保用户能够安全合法地获取所需软件。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 优化版Windows 10 LTSC 21H2企业版:适用于低内存设备
    此版本为经过优化的Windows 10 LTSC 21H2企业版,特别适合低内存配置的计算机。它基于官方版本进行了精简和性能优化,确保在资源有限的情况下依然能够稳定运行。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
author-avatar
ygluo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有