-
近期文章
标签
文章归档
- 2020 年一月
- 2019 年六月
- 2018 年四月
- 2017 年八月
- 2017 年七月
- 2016 年十一月
- 2016 年十月
- 2016 年六月
- 2016 年五月
- 2016 年一月
- 2015 年十二月
- 2015 年十一月
- 2015 年十月
- 2015 年九月
- 2015 年八月
- 2015 年六月
- 2015 年五月
- 2015 年四月
- 2015 年三月
- 2015 年一月
- 2014 年十二月
- 2014 年九月
- 2014 年八月
- 2014 年六月
- 2014 年五月
- 2014 年四月
- 2014 年三月
- 2014 年一月
- 2013 年十二月
- 2013 年十一月
- 2013 年十月
- 2013 年九月
- 2013 年八月
- 2013 年七月
分类目录
功能
月归档:2014年06月
学习ClassLoader和自定义ClassLoader的使用
这几天在看ClassLoader,推荐一篇讲ClassLoader的文章,地址:http://longdick.iteye.com/blog/442213,然后又看了下《深入java虚拟机》里的ClassLoader章节,下面就随便说点,主要还是以练习代码为主。 1.对于任意一个类,由加载它的ClassLoader和它本身决定了在java虚拟机中的唯一性。 也就是说比较2个类,只有它们都是由同一个ClassLoader加载,那么比较才有意义。否则,即使是同一个类文件,如果加载它们的ClassLoader不同,那么这2个类必定不相等。 2.类加载的双亲委派机制是可以破坏的,通过改变CallClassLoader和ContextClassLoader。 被当前类引用的类的加载也是由加载当前类的ClassLoader加载,子线程的ContextClassLoader是由父线程的ContextClassLoader派生出来。 3.扩展ClassLoader一般应该建议重写findClass(String)方法。 原因是自定义的ClassLoader只专注于加载自己的Class,在加载自己的Class的过程中,又会先加载父类Object,Object类是由启动类加载器加载的,默认可以直接由loadClass(String)执行,这么做可以用ClassLoader来选择性加载某一些类做隔离。 贴代码 自定义ClassLoader,重写loadClass()。 测试类 执行结果: sun.misc.Launcher$AppClassLoader@addbf1 ==> 当前上下文类加载器是应用类加载器 sun.misc.Launcher$ExtClassLoader@42e816 ==> 应用类加载器的父类加载器是扩展类加载器 null ==> 扩展类加载器的父类加载器是启动类加载器,因为启动类加载器是C++编写,java里获取不到 class com.zoo.classloader.ClassLoaderTest ==> 自定义类加载器加载进行加载 com.zoo.classloader.MyClassLoader@1fb8ee3 ==> 通过Class对象获取它的类加载器 false ==> 同一个Class,不同的类加载器加载,那么Class不相等 hello world ==> 被自定义类加载器加载的Class在程序中执行 sun.misc.Launcher$AppClassLoader@addbf1 ==> 获取当前上下文类加载器 com.zoo.classloader.MyClassLoader@1fb8ee3 ==> 设置上下文类加载器 … 继续阅读