`

openfire源码解读第一节----ClassLoader的认识与理解

阅读更多

1.openfire的入口main文件在src/java 文件夹下的org.jivesoftware.openfire.starter包中。

2.运行main函数之后openfire会调用start方法,首先是获取到ClassLoader对象。那么什么是ClassLoader对象呢?

下面具体学习ClassLoader的知识。

  1. 首先ClassLoader作用是加载Class文件到jvm中,供程序使用,java程序可以动态加载类定义,这个动态加载的机制就是通过ClassLoader来实现的。

  2. ClassLoader 是加载Class文件的(ExtClassLoader和AppClassLoader也在此时被加载),那么ClassLoader又被谁加载呢?是一 个被不是java语言所编写的ClassLoader来加载的,这个ClassLoader就是bootstrapClassLoader(启动类加载 器)。这个加载器在jvm运行的时候加载java核心的api以满足java程序最基本的需求。其中包括用户定义的ClassLoader,用户定义的 ClassLoader就是通过程序创建的ClassLoader,那么也有非程序员创建的ClassLoader,就是jvm自己提供的吧(这句是自己 理解的)。用户自定义的ClassLoader有ExtClassLoader,ExtClassLoader加载java的扩展的api,也就是 /lib/ext中的类。用户自定义的ClassLoader还有AppClassLoader,AppClassLoader用户机器上的 CLASSPATH设置目录中的Class的,通常在没有指定ClassLoader的情况下,程序自定义的类由AppClassLoader加载

  3. ClassLoader 的加载模式:双亲委托模式进行加载。该模式的原理是:某个自定义的ClassLoader加载Class的时候都会先委托他的parnet ClassLoader加载该Class,当parent ClassLoader加载失败,再由当前的ClassLoader加载该Class,但是如果该ClassLoader的parent ClassLoader为null那么该ClassLoader的parent就是bootstrapClassLoader。

  4. 使用双亲委托模式的优点是:

    第一:避免重复加载,当父亲已经加载了该类,那么子ClassLoader就没有必要加载该class了。

    第二:安全因素。

     

3.获取当前类的类类加载器的方法:

public ClassLoader findParentClassLoader(){ 
//获取父类加载器 
    ClassLoader parent = Thread.currentThread().getContextClassLoader(); 
if(parent==null){ 
    parent = this.getClass().getClassLoader(); 
    if(parent==null){ 
        parent = ClassLoader.getSystemClassLoader(); 
} 
} 
return parent; 
}

4.类加载器的种类:

  •  bootstrap class Loader(引导类加载器) 用来加载java的核心类库

  •  extensions class loader(扩展类加载器) 用来加载java的扩展库Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类[ExtClassLoader]

  • 系统类加载器(system class loader)Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它[AppClassLoader]

     

     

 

1
2
分享到:
评论
3 楼 leaow567 2013-05-20  
表达不严谨“用户自定义的ClassLoader有ExtClassLoader”么??
2 楼 leaow567 2013-05-20  
顶起!一起学习
1 楼 ywbrj042 2013-05-20  
我们也在用这个,也在看openfire的源代码。以后可以一起交流!

相关推荐

Global site tag (gtag.js) - Google Analytics