您的位置:首页 > 其它

ClassLoader工作机制介绍(整理版)

2015-11-24 19:12 375 查看
1、ClassLoader类结构

我们经常扩展ClassLoader以及它的重载方法:其主要方法有defineClass、findClass、loadClass、resolveClass。其中defineClass方法用来将byte字节流解析成JVM能够识别的Class对象。findClass方法和defineClass一起使用,通过覆盖ClassLoader父类的findClass方法来实现类的加载规则,从而取得加载类的字节码,然后调用defineClass方法生成类的Class对象。ClassLoader是个抽象类,它还有很多子类,我们可以实现自己的ClassLoader,一般要继承URLClassLoader这个子类,调用其相关方法。

2、ClasLoader加载机制

整个JVM平台提供三层ClassLoader

1)、Bootstrap ClasLoader(搜索路径 -Xbootclasspath/a:),它主要加载自身工作需要的类,仅仅是一个加载工具,没有更高一级的父加载器,也没有子加载器。

2)、ExtClassLoader(搜索路径 -Djava.ext.dirs),继承URLClassLoader,并遵守ClassLoader的加载规则。

3)、AppClassLoader(搜索路径 -Djava.class.path= -cp 或 -classpath),其父类是ExtClassLoader,通常在classpath目录下加载。



JVM加载class文件到内存中有两种方式:隐式加载、显示加载。所谓隐式加载不通过代码调用继承ClassLoader,自动加载到内存中,显示加载需要调用继承ClassLoader类,例如:this.getclass.getClassLoader().loader()。

3、加载class文件

step 1、找到.class文件并把这个文件包含的字节码加载到内存中。

step 2、包括三个步骤,分别是字节码验证、Class类数据结构分析及相应的内存分配和最后的符号表的链接。

step 3、类中静态属性和初始化赋值,以及静态快的执行等。

4、常见加载错误分析(介绍两例)

1)、ClassNotFoundException异常是java初学者经常遇到的,异常原因是加载不到类,就是JVM要加载指定文件的字节码到内存时,并没有找到这个文件对应的字节码,也就是这个文件并不存在。解决办法就是检查当前的classpath目录下有没有制定的文件存在。如果不知道当前的classpath路径,就可以通过如下命令来获取:

this.getClass().getClassLoader().getResource("").toString()

2)、NoClassDefFoundError,这个异常在第一次使用命令执行java类时很可能碰到,如下java -cp example.jar Example。在这个jar包里面只有一个类,这个类是com.cn.Example,正确的写法是这样的:java -cp example.jar com.cn.Example。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: