今天下午被一个同事问起,什么情况下需要用到ContextClassLoader
另一篇博客
http://kyfxbl.iteye.com/blog/1900855已经介绍过了,这里就再举个更简单的例子
一个很常见的例子,是在JNDI里的。JNDI的入口类在rt.jar里,是由bootstrap classloader加载的;而JNDI的SPI实现类,则是由各厂商提供的,一般在classpath里,由app classloader加载
所以如果在JNDI的入口类里执行:
Class.forName("xxx.xxx.xxx");
就会抛ClassNotFoundException,要用这个方法才可以
public static Class<?> forName(String name, boolean initialize,
ClassLoader loader)
throws ClassNotFoundException
上面这个方法的第3个参数,就是从ContextClassLoader里来的,用
Thread.currentThread().getContextClassLoader();
下面再用一段代码模拟一下
public class Dong {
public void call() {
try {
Class.forName("net.kyfxbl.test.cl.Target").newInstance();
} catch (Exception exc) {
exc.printStackTrace();
}
}
}
下面还有一个Target类,只是用来占位
public class Target {
}
最后是作为入口的main方法
public static void main(String[] args) {
Dong dong = new Dong();
dong.call();
}
直接执行是没问题的
然后把Dong这个类打到jar包里,然后放到bootstrap classloader的加载路径里
然后编译会报错,因为bootstrap classloader加载的JAR包默认是不允许乱改的,可以强行去掉这个限制
然后再次执行main方法,就抛出了ClassNotFoundException。因为bootstrap是看不到classpath里的Target类的。同样的代码,在运行时却有不同的表现
- 大小: 45.5 KB
- 大小: 39.2 KB
分享到:
相关推荐
java类加载器的小例子程序,大家可以参看我的博文
Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
自定义classloader的使用
ClassLoader原理,ClassLoader原理 ClassLoader原理
Java ClassLoader定制实例
破解java加密的ClassLoader.java,在classloader植入破解代码
一个开源的Cplusplus类加载器,基于它实现了一个简单的例子,见我写的classloader的文章。
Classloader
java classloader classpath 张孝祥
理解Java ClassLoader机制
用于验证理解Android中Classloader加载类机制的程序demo,从中可以对比DexClassLoader和PathClassLoader的区别联系。
NULL 博文链接:https://andilyliao.iteye.com/blog/625682
classloader-playground, 一个简单的java依赖隔离容器类
ClassLoader类加载机制和原理详解
classloader 源码,自定义classloader
JVM内存模型,类加载模式工作机制详细,内存屏障,类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三...
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解