classloader

Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和URLClassLoader,其中AppClassLoader在很多地方被叫做System ClassLoader。

Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库比如rt.jar,tools.jar等。
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。用的不多,比如dns,security什么的。
AppClassLoader用来加载Classpath的类,实际上我们还常用AppClassLoader来加载配置文件。spring可以用classpath做前缀,就是这个原理。
URLClassLoader用来加载网络上远程的类,不讨论。

按顺序是从大到小。 java 的class 加载采取委托模式:某个classloader 加载之前会先调用他上级来加载,只有上级找不到了,才会自己加载。这样做的第一个好处就是为了安全。比如,一定没有人能够伪造jre 标准类的java.lang.String。

载入class不等于new一个class。
在jdbc代码中有一句奇怪的。class.forName("xxxDriver");看驱动源码

public class Driver extends NonRegisteringDriver{

public Driver() throws SQLException{}

static {
try{
DriverManager.registerDriver(new Driver());
}
catch(SQLException E){
throw new RuntimeException("Can't register driver!");
}
}
}


Driver 中只有一个静态的方法把自己注册到driverManager中。那么就完全没必要new一个他的实例。载入就好了。但是想想还是不对,driver不是在web Server起来的时候就载入了吗?

最终结论:class的static块,调用ClassLoader.loadClass是不会执行的。只有在调用forName(String)载入class时执行。static永远只会执行一次。想来web服务器装载类的时候都是用的loadClass方法吧。

注:如果需要指定classLoader,使用自定义的classLoder加载,比如tomcat下面挂10个应用,可以在各自的线程中通过setContextClassLoader方法绑定各自的classLoader。
另:servlet的加载方式违背了委托模式。
详见tomcat的类加载机制:
[url]http://www.blogjava.net/tomjamescn/archive/2009/06/23/283670.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值