ClassLoader详解:
1.Bootstrap ClassLoader
Sun JDK采用C++实现的此类,此类并非ClassLoader的子类,在代码中没有办法拿到这个对象,Sun的JDK启动会初始化这个ClassLoader,并由他完成$JAVA_HOME中jre/lib/rt.jar里面所有的class文件的加载,jar中包涵了java规范定义的所有的接口及实现。
2.Extension ClassLoader
JVM用他来加载一些扩展功能的jar,例如Sun的jdk目录下有dns工具jar包等等,在Sun的JDK下该ClassLoader对应的类名为ExtClassLoader。
3.System ClassLoader
SUN的JDK用此ClassLoader来加载JVM启动启动参数中指定的ClassPath中的Jar包及目录,在Sun的 jdk中此ClassLoader对应的类名为AppClassLoader。
4.User-Define ClassLoader
User-Define ClassLoader是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader,此ClassLoader可用于加载非Classpath中中(例如从网络上下载的jar或者二进制)的jar文件及目录,还可以在加载前对class做一些额外的动作,例如类的解密等等。
JVM的ClassLoader采用的是树形结构,除了BootStrap以外,其他的ClassLoader都有其parent classLoader,User-Define ClassLoader默认的parent ClassLoader为System ClassLoader。类的加载通常也会按照树形结构,首先从parent ClassLoader中开始加载,当其中没有时尝试从System ClassLoader中加载,以此来避免同一个类被ClassLoader的不同实例加载多次。
JVM常见的异常介绍:
1.ClassNotFoundExcption
这是常见的一个异常,产生的原因是因为当前的ClassLoader中没有找到对应的类,判断System ClassLoader的类就是看该类是否在classpath中,如果是User -Define ClassLoader则要具体分析此ClassLoader加载类的过程。例如我们的反射中常用的Class.forname(“com.david.example.ClassA”),如果当前的ClassLoader中根本就没有该类所在的jar包或class文件,就回抛出ClassNotFoundException。
2.NotClassDefFoundError
此异常通常是由于一个类中引用了另外的一个类,而被引用的类没有被classLoader找到。如下面的例子:
Class Student(){
。。。。。。
private teacher = new Teacher();
。。。。。。
}
当ClassLoader加载时,虽然可以找到student的类,但是无法找到teacher的类,所以便会抛出此异常。
3.LinkageError
此异常产生的原因就是一个类被重复的加载了。
4.ClassCastException
此异常在我们使用泛型后,触发的几率很低。比较难找的是属于同一个类被不同的ClassLoader加载了,如果这两个类互相转换就会报错。