Class.forName(classname)默认是用调用 ClassLoader.getCallerClassLoader()这个方法来获得调用者类的加载器,而调用者的类加载器再利用classLoader的委托模型去加载。其实每次new一个类的时候,也是通过 ClassLoader.getCallerClassLoader()去获得调用者类的加载器来加载的。
Java中的类加载器可以分为四类:
1 Bootstrp loader
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类,并且它也会加载ExtclassLoader类。
2 ExtClassLoader
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.当时因为bootstrp loader不是JAVA写的,所以占在JAVA的角度来看,调用Extclassloader的getParent()返回的是null.ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext中的jar文档,以及此路径下的所有classes目录。
3 AppClassLoader
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档。
4 URLClassLoader
URLClassLoader是我们可以自定义的加载器,我们可以通过指定一个URL对象来创建此加载器,它所加载路径就是URL所代表的逻辑位置。并且它的父加载器是AppClassLoader。
有了这个加载器的继承体系以后,就可以清楚的知道委托模型是怎么实现的了,当一个加载器要加载一个类的时候,首先请求父加载器来加载,父加载器再请求父加载器来加载,依此类推,如果所有的父加载器都不能加载,那么才有自己加载,如果也不能加载,则出现NoClassDefFoundError错误.所以打包的时候,其实是将自己的类放在规定的地方,让框架已经实现的类加载器来加载,这样以来,就可以让框架来管理自己些的类的生命周期。在一般的情况下,我们自己写的类,默认都是由AppclassLoader来载入的,只要class的全名不和AppclassLoader的父加载器已经加载的类相同就OK。
分享到:
相关推荐
ClassLoader分为三个主要层次:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader(也称为System ClassLoader)。Bootstrap ClassLoader是JVM启动时的第一个ClassLoader,负责加载JRE的`<JAVA_HOME>/...
1. 类别载入器的层次结构:Java类别载入器通常由Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和AppClass ClassLoader(应用程序类加载器)组成,形成一个树状的父子关系。...
Java虚拟机(JVM)有多个内置的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader,它们按层次结构工作,依次加载类。用户还可以自定义类加载器以满足特定需求,例如加载网络上的类或加密...
值得注意的是,JVM的类装载器并不是一个,而是三个,层次结构如下: * Bootstrap Loader:负责加载系统类 * ExtClassLoader:负责加载扩展类 * AppClassLoader:负责加载应用类 类加载器之间的协调工作 Java中有...
默认的类加载器层次结构由Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader组成。开发者还可以自定义类加载器,以实现特定的加载逻辑,如从网络或数据库加载类。 总之,`package`和`import`机制为...
JVM中的类加载器并不是一个,而是三个,层次结构如下:Bootstrap Loader、ExtClassLoader和AppClassLoader。Bootstrap Loader负责加载系统类,ExtClassLoader负责加载扩展类,AppClassLoader负责加载应用类。 类...
10. **类加载器**:JVM提供不同的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassloader,以及用户自定义类加载器。了解它们的层次关系和工作原理对理解和解决类冲突有帮助。 以上只是JVM理解...