来自深入java虚拟机的介绍,关于JVM加载class的原理,主要有几个重点。
1. ClassLoder的种类
内置的ClassLoader有3种,一是BootstrapClassLoader,这是根loader,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等;二是ExtensionClassLoader,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar;三是AppClassLoader:负责加载应用程序classpath目录下的所有jar和class文件。
2.双亲委派
逻辑是,每当要加载一个类时,都会先让父加载器先加载来避免一些安全问题
关键源码:
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
3.一个有意思的例子
在同一个项目中,同时引用两个定义了Class Test的jar包,调用的时候发现,只有其中一个jar包会在编译中起作用,原因就是加载器在加载的时候会总是发现Test类已经被加载了,而忽略另外的Test类,删掉起作用的jar包之后,另一个Test类才能起作用,从另外一个角度上说,包名相同类名也相同的情况,应该在实践中绝对避免。
4.动态加载的class类
观察Class.forName()方法的源码,发现它的实现是调用了一个本地方法,查找资料得知,这里的本地方法,应该是通过加载器的loadClassInternal方法来找对应的类,而这一步,就回到了上述的双亲委派的过程了。
5.自定义的加载器
要自定义加载器,主要是要实现findClass方法,不管用什么方式,从网络也好,从文件也好,找到Class文件,序列化成字节流后通过defineClass方法来把字节流变成一个Class对象,返回到加载器,这个类的加载的流程就完成了。
分享到:
相关推荐
Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
自定义classloader的使用
ClassLoader原理,ClassLoader原理 ClassLoader原理
Java ClassLoader定制实例
破解java加密的ClassLoader.java,在classloader植入破解代码
Classloader
java classloader classpath 张孝祥
理解Java ClassLoader机制
用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。
classloader 源码,自定义classloader
ClassLoader类加载机制和原理详解
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
探索JVM底层奥秘ClassLoader源码分析与案例讲解,探索JVM底层奥秘ClassLoader源码分析与案例讲解.
classloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloaderclassloader
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...
JVM ClassLoader简析.压缩包中文档和示例代码
Sun 官方关于 ClassLoader原理的文章,值得一看