黑马程序员 24 Java基础加强-06-内加载器篇

本文深入探讨Java类加载器的工作原理及其委托机制。通过解析不同类型的类加载器(如Bootstrap ClassLoader、ExtClassLoader等)的功能与职责,揭示Java程序如何实现动态性。

               -------android培训java培训、期待与您交流! ----------



本日志doc文档下载



About 类加载器

java是具有动态性,什么是动态性?有个最直观的例子:windows系统的即插即用,支持即插即用的设备可以在系统不重新启动的情况下既可以热拔插使用。而java的动态性表现在:我们的程序可以不用全盘的重新编译就能对程序某部分进行更新,C#也和java一样具有动态性,而且它的这种动态性表现更为直观:直接生成windows的动态连接库文件——dll文件。而java生成的是class文件,class是怎么实现动态性的了,这个时候就全靠:java的类加载器。

在java中每个类都是由某个类加载器的实体来载入的,因此在Class类的实体中,都会有字段记录载入它的类加载器的实体(当为null时,其实是指Bootstrap ClassLoader)。 在java类加载器中除了引导类加载器(即Bootstrap ClassLoader),所有的类加载器都有一个父类加载器(因为他们本身自己就是java类)。而类的加载机制是遵循一种委托模式:当类加载器有加载类的需求时,会先请求其Parent加载(依次递归),如果在其父加载器树中都没有成功加载该类,则由当前类加载器加载。

 

1、类加载器的委托机制

1.1、当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?

1、首先当前线程的类加载器去加载线程中的第一个类。

2、如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。 (还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。)

3、每个类加载器加载类时,又先委托给其上级类加载器。

4、当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?

对着类加载器的层次结构图和委托加载原理,解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,运行结果为ExtClassLoader的原因。

1.2、类加载器之间的父子关系和管辖范围图

1.2.1、Java的类加载器分类的详细描述:
  1、Bootstrap ClassLoader,用C++实现,一切的开始,是所有类加载器的最终父加载器。负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。
  2、ExtClassLoader,用java实现,此类由Bootstrap ClassLoader加载,但由于Bootstrap ClassLoader已经脱离了Java体系(c++),所以Launcher$ExtClassLoader.class的Parent(父加载器)被设置为null;它用于装载Java运行环境扩展包(jre/lib/ext)中的类,而且一旦建立其加载的路径将不再改变。
  3、AppClassLoader,用java实现,也是Launcher.java的内部类,编译后的名字为:Launcher$AppClassLoader.class 。AppClassLoader是当Bootstrap ClassLoader加载完ExtClassLoader后,再被Bootstrap ClassLoader加载。所以ExtClassLoader和AppClassLoader都是被Bootstrap ClassLoader加载,但AppClassLoader的Parent被设置为ExtClassLoader。可见Parent和由哪个类加载器来加载不一定是对应的。而它的查找区域就是我们常常说到的Classpath,一旦建立其加载路径也不再改变。
 4、ClassLoader:一般我们自定义的ClassLoader从ClassLoader类继承而来。比如:URLClassloader是ClassLoader的一个子类,而URLClassloader也是ExtClassLoader和AppClassLoader的父类(注意不是父加载器)。

 

 

### 黑马程序员 Java 多媒体播放器案例分析 #### 1. 案例概述 黑马程序员提供的 Java 多媒体播放器案例是一个典型的桌面应用程序开发实例。该案例通常基于 Swing 或 JavaFX 技术栈实现,旨在帮助学习者掌握 GUI 开发的核心技能以及多媒体文件处理的基础方法。 以下是可能涉及的关键技术点: - **图形界面设计**:通过 `Swing` 或 `JavaFX` 构建用户交互界面。 - **事件驱动编程**:利用监听器机制响应用户的操作,例如按钮点击、菜单选择等[^1]。 - **多媒体文件加载与播放**:借助第三方库(如 JMF - Java Media Framework)或原生 API 实现音频/视频文件的解析与播放功能[^3]。 --- #### 2. 示例代码结构 ##### 图形界面构建 以下是一个简单的 Swing 基础框架示例,用于展示如何搭建基本的窗口布局并添加控件: ```java import javax.swing.*; import java.awt.*; public class MediaPlayerUI extends JFrame { public MediaPlayerUI() { setTitle("Java 多媒体播放器"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); JButton playButton = new JButton("播放"); JButton pauseButton = new JButton("暂停"); panel.add(playButton); panel.add(pauseButton); add(panel, BorderLayout.SOUTH); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { MediaPlayerUI frame = new MediaPlayerUI(); frame.setVisible(true); }); } } ``` 上述代码展示了如何使用 `JFrame` 和 `JPanel` 创建一个基础的播放器窗口,并添加两个按钮分别表示“播放”和“暂停”的功能。 --- ##### 多媒体播放逻辑 为了实现实际的多媒体播放功能,可以引入 JMF 库来完成音视频流的解码与渲染工作。下面是一段伪代码片段,演示了如何初始化播放组件并与 UI 进行绑定: ```java import javax.media.Player; import javax.media.Manager; public class MediaPlayerLogic { private Player player; public void loadMedia(String filePath) throws Exception { player = Manager.createPlayer(getClass().getResource(filePath)); player.start(); // 启动播放 } public void stopPlayback() { if (player != null && player.isActive()) { player.stop(); player.close(); } } } ``` 此部分实现了对指定路径下多媒体文件的加载与控制逻辑。需要注意的是,JMF 的兼容性和性能表现可能会受到运行环境的影响,因此建议开发者根据具体需求评估其适用性。 --- #### 3. 扩展功能设想 除了核心的功能模块外,还可以考虑加入一些增强用户体验的设计要素,比如: - 支持多种格式文件的导入与预览; - 提供进度条实时更新当前播放位置; - 添加音量调节旋钮以便灵活调整输出响度; - 整合拖拽排序列表视图以管理播放队列[^2]。 这些改进措施不仅能够提升应用的整体质量,同时也为学员提供了更多实践机会去深入理解相关知识点的应用场景和技术细节。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值