如果是长期的学习计划,我还是比较倾向于学习一本完整的书籍,或者至少是其中的几章重要的章节,这样会比较系统,不会像平时那样的东一榔头西一棒子,如果学得和我们平时工作的息息相关,经常会发现才学的就能被用上。其实,只不过以前不会发现这些隐藏的东西罢了,不信?你可以试试看。
啰嗦了这么多,也该说点实际的了。
我的切入点是java核心编程卷2第九章,安全。第一节是类加载器。这一部分以前只是知道,但并不了解,看来有必要深入一下。翻了翻书,如果不知道反射的童鞋,应该就不用往下看了,你要硬看,还不如刷会微博。(哥,你真刷去了?)
ok.先说一些废话(不好意思,又来了),这章介绍的是安全,所以,整章应该是以安全角度来介绍所有知识的,不过,也不妨碍我们学习类加载器,多学点安全知识罢了。
那么,就先说说,Java编译器吧。它会为虚拟机转换源指令。虚拟机代码存储在.class的类文件中,这些文件就会包含某个类,或者接口的实现。还需要一个解释器,它来把所有的虚拟机的指令集,解释成目标机器的机器语言,这个就偏底层了,先不考虑。
这样,虚拟机是如何加载一些所需要的类文件呢?这里,假设程序从MyProgram.class开始运行,下面是虚拟机的执行步骤:
1.虚拟机有一个用于加载类文件的机制。
2.如果MyProgram类拥有类型为另一个类的实例变量,或者父类,那么这些类也会被加载。
3.接着,虚拟机执行MyProgram的main方法。
4.如果main方法调用了更多的类,那么接下来就会加载这些类。
上面所说的类加载机制,并不实用单个类加载器,每个java程序至少拥有三个类加载器。
引导类加载器:这个事由c语言实现的它没有ClassLoader对象,如String.class.getClassLoader(),会返回null。它通常会从rt.jar中进行加载。
扩展类加载器:用于从目录jre/lib/ext目录加载“标准的扩展”(因为它不会使用类路径),可以放jar到此路径下,即使没有任何类路径。
系统类加载器:用于加载应用类。它在有CLASSPATH环境变量或者-classpath命令行选项设置的目录里找到这些类。
这些类加载器是有父子结构的,父亲会得到先行加载的机会,所以,一个系统类加载器加载一个系统类(如java.util.ArrayList)时,它首先要求扩展类加载器进行加载,扩展类会首先要求引导类加载器加载,引导类加载器查找并加载rt.jar中的这个类。
插件架构的程序:
URL url = new URL("file://path/to/plugin.jar");
URLClassLoader pluginLoader = new URLClassLoader(new URL[] { url });
Class<?> cl = pluginLoader.loadClass(mypackage.MyClass);
因为在URLClassloader构造器中指定父类加载器(不太明白,难道是代码内部写的?),因此pluginLoader的父亲就是系统类加载器,那么,层次如下:
Bootstrap类加载器 | rt.jar |
Extension类加载器 | jre/lib/ext |
System类加载器 | CLASSPATH |
Plugin类加载器 | plugin.jar |
这样,想象一场景,我们在插件包中(或者不在插件包中,但为了说明类加载器的传递问题)使用Class.forName(classNameStr),这个类是插件jar中的类。
那么,如果使用Plugin类加载器以上三层的任意类加载器,都不会得到这个类。
有两种方法可以避免:
1.使用参数传递进来ClassLoader对象,使用此对象对类进行加载。
2.使用上下文类加载器。每个线程都有一个对类加载器的引用,成为上下文加载器,主线程的为系统类加载器,当新线程被创建,默认会设置成系统类加载器,也可以:
Thread t = Thread.currentThread();
t.setContextClassLoader(loader);
那么我们使用时:
Thread t = Thread.currentThread();
ClassLoader loader = t.getContextClassLoader();
Class c1 = loader.loadClass(className);
所以,如果你编写了一个按名字来加载类的方法,最好让调用者在传递显示的类加载器和使用上下文加载器之间进行选择,而不是直接使用此方法所属的类的类加载器。
类加载器有了初步的认识了,细水长流,下次再继续吧。
分享到:
相关推荐
在Java Web应用中,类加载...通过分析`web_classloader_test`,我们可以学习到如何理解和调试Web应用的类加载问题,以及如何利用类加载器的特性来实现特定的功能。这个示例对于理解Java Web应用的运行机制非常有价值。
这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...
3. 类加载器:学习不同的类加载器,如Bootstrap ClassLoader,Extension ClassLoader和App ClassLoader。 4. 垃圾回收:深入理解垃圾回收机制,如分代收集,可达性分析,以及不同GC算法,如Serial、Parallel、CMS和...
【Java学习笔记整理】 Java是一种广泛使用的编程语言,它不仅是一种语言,还是一个软件开发平台和运行环境。Java分为三个主要版本:Java标准版(JSE)、Java缩微版(JME)和Java企业版(JEE)。JSE主要用于桌面应用...
丛书名: 学习笔记 出版社:清华大学出版社 ISBN:9787302282082 上架时间:2012-5-9 出版日期:2012 年5月 开本:16开 页码:564 版次:1-1 所属分类:计算机 > 软件与程序设计 > JAVA(J#) > Java 编辑推荐 ...
### Java学习笔记知识点总结 #### 一、JVM与内存管理 **1.1 JVM基本概念** - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程...
它可以在不修改原有代码的情况下,为类添加额外的功能,如日志记录、事务管理、性能监控等。这种技术在插件框架、代理服务和调试工具中广泛应用。 总结起来,Java的类加载机制保证了程序的稳定运行,而ASM库则提供...
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...
根据提供的文件信息,这里将对Java学习笔记中的关键知识点进行详细阐述,主要涉及Java语言的基础概念、面向对象编程思想的应用以及Java类加载器的工作原理等内容。 ### Java学习基础 Java是一种广泛使用的高级编程...
这一过程涉及到类加载机制,包括Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader和Custom ClassLoader,它们按照特定的层次关系和加载顺序加载类,确保类的唯一性。 类执行机制中,JVM基于栈的架构...
### J2EE-JDBC学习笔记知识点详述 #### JDBC驱动注册的三种方式 在Java开发中,使用JDBC(Java Database Connectivity)与数据库进行交互前,必须先注册对应的数据库驱动。J2EE环境下,通常有以下三种注册方式: ...
### 安卓逆向学习笔记之ART定制方案比较和流程 #### 一、概述 本文档旨在探讨Android Runtime (ART)环境下,针对不同ART定制方案的对比分析,并介绍实现逆向工程过程中的具体步骤与技巧。逆向工程是研究软件内部...
### Spring Boot 学习笔记之热部署与代码变更检测 #### 概述 Spring Boot 是一个基于 Spring 的框架,旨在简化新 Spring 应用程序的初始设置和开发过程。Spring Boot 的目标是允许开发者“只是运行”,即尽可能...
### 安卓逆向学习笔记之使用frida改进FART #### 一、FART工具原理及工作流程 FART(Find And Replace Tool)是一种针对Android应用进行逆向工程的工具,主要用于查找并替换Android应用中的指定代码或数据。本文档...
### 安卓逆向学习笔记之FART主动调用组件设计和源码分析 #### 一、概述 本文档旨在探讨安卓逆向工程中的一个重要工具——FART(Find And Replace Tool),并着重介绍如何利用该工具进行主动调用组件的设计与源码...
本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...
Java学习笔记JDK6课件第16章深入讲解了反射机制,这是Java语言中一个强大的特性,允许我们在运行时动态地获取类的信息并进行操作。反射的核心是`java.lang.Class`类,它代表了Java应用程序运行时加载的类或接口实例...
这份"Java学习笔记_内存管理.pdf"很可能是详细解析了Java如何进行内存分配、垃圾回收以及内存泄漏等相关概念。下面,我们将深入探讨Java内存管理的一些核心知识点。 1. **Java内存模型**: - **堆内存(Heap)**:...
- JVM类加载器包括Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader,分别负责加载Java核心库、扩展库和应用程序类库。 8. Java中的异常处理 - Java使用try、catch、finally关键字来处理...
### JVM学习笔记知识点详解 #### 一、JVM的基本结构 **JVM(Java Virtual Machine,Java虚拟机)**是一种可以执行Java字节码的虚拟机。它为Java提供了平台无关性,使得Java代码可以在任何安装了JVM的平台上运行。 ...