http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 这篇文章对于类加载器的知识写得已经非常
到位了。不过我看的时候还有些思路理不顺的地方。我把其中的疑问以及思考的过程记录下来:
1.new的时候使用的是什么类加载器?
答:这个问题其实非常的弱智,能被它蒙住算我倒霉。类加载器加载的是类(class),是一个类型。而new的是对象,是某个
具体类型的实例。这是完全不同的两个过程。想象加载器的工作场景,见如下代码:
A的字节码被虚拟机加载的时候,发现A类中引用了B和C的两个类,所以虚拟机就用加载了A类的类
加载器加载了B和C这两个类型。不管B或C被new了几千,几万个,他们的类型也只会被加载一次,
然后缓存起来。
2.线程上下文类加载器有什么用处?有哪些典型的应用场景?
答:看这篇文章讲线程上下文加载器的时候没怎么看懂。它上面说如果B接口是由引导类加载器加载的
java核心类,而我们自己写的A类实现B的接口的话,并且A类是存在于classpath中,由系统类加
载器加载,那么会问题。
我想了,继承或实现java核心类库这种程序形式太普通了。我怎么从来没碰过问题?
后来想通了,拿JNDI举例了。jndi包里的context是核心类,是由引导类加载器加载,当我们用
context.looup(classname)某个classpath中类包的类B时,虚拟机根据类加载原则,仍然用引导
类加载器去加载B。这不就错了吗!!它哪儿找得找啊。。。。
所以这种情况就使用线程上下文加载器,因为它默认是使用系统类加载器的。这样就解决问题了