题记:
看到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);
...
}
}
分享到:
相关推荐
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介
自定义classloader的使用
ClassLoader原理,ClassLoader原理 ClassLoader原理
Java ClassLoader定制实例
Classloader
java classloader classpath 张孝祥
理解Java ClassLoader机制
用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。
classloader 源码,自定义classloader
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
classloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloader
ClassLoader类加载机制和原理详解
JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
JVM ClassLoader简析.压缩包中文档和示例代码
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
java类加载器的小例子程序,大家可以参看我的博文