题记:
看到InfoQ关于ClassLoader的文章,挺给力。自己对ClassLoader有更全面的认知。
Java编译成class给JVM运行,JVM通过ClassLoader去load这个class并为每个class有且只生成一个Class类,以后这个Class就可以生成instance实例了。为了保护某个类不重复加载,JVM就需要在加载class的时候去查询,这个工作由ClassLoader的findLoadedClass和findBootstrapClass0来做。 ClassLoader也搞了个继承,处于最顶层是BootstrapClass,然后ExtClassLoader,然后AppClassLoader。那到底先从哪个ClassLoader开始呢?
先从当前ClassLoader开始,ClassLoader代码如下:
除开其他关于loadResource的方法,只有一个loadClass的public方法,如下:
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// 首先,查询名为name的class有没有加载过
Class c = findLoadedClass(name); // 查询当前ClassLoader有没有加载过
if (c == null) { // 如果没有
try {
if (parent != null) {
c = parent.loadClass(name, false); // 查询上层LoadClass有没有加载过
} else {
c = findBootstrapClass0(name); // 一直遍历到了BootstrapClassLoader,native方法 }
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name); // 可扩展点
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
所以写自己的ClassLoader可以override findClass方法,然后调用protected final Class<?> defineClass(String name, byte[] b, int off, int len)来加载class了。
当然你也可以只override loadClass方法,但什么都不做。然后调用defineClass来尝试加载同一个class,我不知道会怎样,还没有尝试过,有人尝试记得告诉我一声。
所以写自己的ClassLoader,就可以这样:
class MyCL extends ClassLoader{
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
...
}
}
分享到:
相关推荐
知识点总结: * Java 类加载机制是 Java 中一个非常重要的机制,它负责加载 Class 文件到 JVM,以供程序使用。 * ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。 * ClassLoader ...
Java是世界上最流行的编程语言之...这些知识点构成了Java开发者必备的基础,深入理解它们有助于编写出高效、稳定的代码。在实际开发中,还需要结合设计模式、异常处理、网络编程等知识,才能构建出完整的Java技术体系。
### Java基础知识点详解 #### 一、Java语言的历史与地位 - **计算机语言的历史:** - **第一代语言(机器语言)**:基于0和1的二进制代码,直接与硬件交互,例如早期的打孔机。 - **第二代语言(汇编语言)**:...
这份名为"2020年Java各知识点综合面试题.zip"的压缩包,包含了全面的Java面试题目,旨在帮助求职者在短期内提升对Java知识的理解,提高获取工作的机会。以下是对这些知识点的详细解释: 1. **Java基础** - 类与...
在面试和技术学习中,JVM及其性能优化是不可或缺的知识点。下面,我们将深入探讨JVM的主要组成部分、工作原理以及性能优化策略。 一、JVM的结构与工作流程 1. 类加载子系统:负责加载类文件,包括类的加载、验证、...
Java 技术点和知识点归纳涵盖了从基础到高级的多...掌握这些知识点不仅能帮助开发者编写出高质量的Java代码,也能在面试中展现出扎实的基础和深入的理解。不断学习和实践这些技术点,将有助于提升Java开发的专业水平。
8. **并发与多线程**:在坦克大战游戏中,可能需要同时处理多个游戏对象的更新和渲染,这就涉及到并发和多线程的知识。Java的Thread类和ExecutorService可以帮助开发者高效地管理游戏的并发执行。 9. **资源管理**...
下面将详细讲解涉及的几个关键知识点: **一、设置表格边框** 1. **选择表格**:首先打开Word文档,找到包含表格的部分,然后选择你想要设置边框的表格或单元格。 2. **设置边框**:右键点击所选表格,从弹出的菜单...
### JVM与性能优化知识点整理 #### 一、JVM内存区域划分 ##### 1. 程序计数器(线程私有) 程序计数器(Program Counter Register),也称为PC寄存器,用于记录当前线程所执行字节码的行号指示器。它是一个较小的...
= 秘书 = 类加载器 = ClassLoader = 保镖 = 字节码校验器 = ByteCode Verifier = 翻译 = 解释执行器 = Interfreter 2:安全 健壮 电力 电信 银行 都会有限考虑使用java实现 3:免费 开源 4:简单 语法简单...
**知识点概述:** - **String 类型的基本理解:** 在 Java 中,`String` 是一个不可变的对象,它代表了字符序列。 - **与其他类型的不同:** `String` 是对象而非原始数据类型;`String` 对象一旦创建后,其值不能...
以下将详细讲解这些知识点: 1. 类的修饰符: - default(默认修饰符):若无任何修饰,类仅能在同一包内的类中访问。 - public:类可被任何地方的类访问。 - final:用于声明最终类,不能被继承。 - abstract...
在面试中,能够清晰地阐述这些知识点将有助于展示你的专业能力。例如,讨论如何处理内存溢出错误、分析线程安全问题、以及解释Java栈与程序计数器在多线程环境中的作用,都是展示技术深度的有效方式。同时,熟悉JVM...
2. **代码复用**:泛型允许开发人员编写可以适用于多种类型的通用代码,减少了代码重复。 3. **性能提升**:泛型避免了运行时不必要的装箱和拆箱操作,提升了性能。 ### Java反射中Class.forName与ClassLoader的...
1. **栈**:每个线程拥有自己的栈空间,用于存储局部变量和方法调用的信息。每当执行一个方法时,就会为该方法分配一个新的栈帧,其中包含局部变量表、操作数栈、动态链接和方法返回地址等。 2. **堆**:是所有...
它是一种多范式的、面向对象的语言,以其“一次编写,到处运行”的特性而闻名。Java的特点包括平台独立性、安全性、高性能、健壮性以及可移植性。它的设计目标是使软件开发过程简化,同时提供丰富的类库支持各种应用...
总的来说,这本书将引导读者进行一次深度的Java技术探索之旅,通过对JVM、Classpath、ClassLoader和import等关键知识点的深入学习,提升开发者对Java平台的理解,从而更好地应对复杂软件开发挑战。
本节将深入探讨Java线程间通信、Java类加载器以及JVM内存模型这三个核心知识点。 首先,我们来讨论Java线程间通信。在多线程环境下,线程间通信是确保程序正确执行的关键。Java提供了多种机制来实现这一目标,如...
在深入理解Java虚拟机的过程中,我们需要掌握以下几个关键知识点: 1. **字节码**:Java源代码编译后生成的中间表示,以`.class`文件形式存在,由JVM负责解释执行。 2. **类加载器**:负责加载类到JVM内存中,包括...
学习 Java 的步骤是非常重要的,掌握每一步骤的知识点是非常必要的。首先,安装好 JDK,编写第一个 Hello World 程序,了解 JDK 的基本概念和 ClassLoader 是如何加载 Class 的。这一步骤是非常基础的,需要认真学习...