ClassLoader的加载机制
时间: 2023-03-14 22:54:17 浏览: 90
ClassLoader是Java中用于加载Java类的对象,它将Java类文件加载到内存中,并在Java虚拟机中生成对应的java.lang.Class对象。
Java虚拟机有三种ClassLoader:
1. 启动类加载器(Bootstrap ClassLoader):用于加载Java运行时环境所需要的类,它加载的类是由C++编写的,并由虚拟机自身启动。
2. 扩展类加载器(Extension ClassLoader):用于加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext目录下的类。
3. 应用程序类加载器(Application ClassLoader):用于加载用户类路径(Classpath)上的类,是Java应用程序的类加载器。
在Java中,每个类都会由对应的ClassLoader加载,并且每个ClassLoader都有一个双亲委派机制来保证Java类的加载安全。在加载某个类时,如果当前ClassLoader无法加载该类,就会委派给它的父ClassLoader去尝试加载。如果父ClassLoader也无法加载该类,就会继续向上委派,直到启动类加载器(顶层父加载器)。如果启动类加载器也无法加载该类,就会抛出ClassNotFoundException异常。
这样做的好处是可以确保Java类的安
相关问题
tomcat类加载机制
Tomcat的类加载机制主要涉及到以下几个方面:
1. Bootstrap ClassLoader:这是Java虚拟机内置的类加载器,用于加载Java核心库,如java.lang包中的类。
2. System ClassLoader:又称为应用程序类加载器,用于加载应用程序classpath下的类。
3. Common ClassLoader:用于加载Tomcat公共类库中的类,如Tomcat的servlet-api.jar。
4. Webapp ClassLoader:用于加载Web应用程序中的类,如WEB-INF/classes下的类和WEB-INF/lib下的jar包中的类。
Tomcat在启动时会先由Bootstrap ClassLoader加载Tomcat自身的类库,然后由System ClassLoader加载Tomcat启动脚本中配置的classpath下的类,接着由Common ClassLoader加载Tomcat公共类库中的类,最后由Webapp ClassLoader加载Web应用程序中的类。
在加载Web应用程序中的类时,Tomcat会使用双亲委派机制,即先由Webapp ClassLoader尝试加载类,如果Webapp ClassLoader无法加载则委托给Common ClassLoader,如果Common ClassLoader仍无法加载则委托给System ClassLoader,最终如果System ClassLoader也无法加载则委托给Bootstrap ClassLoader。
这种双亲委派机制保证了类加载的顺序和一致性,避免了类的重复加载,也防止了恶意代码的注入。
springboot类加载机制
Spring Boot 使用标准的 Java 类加载机制来加载和管理应用程序的类。在 Spring Boot 应用程序启动时,会通过类加载器来加载应用程序的所有类。
Spring Boot 使用的类加载器层次结构由以下几个组成:
1. Bootstrap ClassLoader:这是 Java 虚拟机(JVM)的根加载器,负责加载 Java 核心类库,如 java.lang 包中的类。
2. Extension ClassLoader:这个类加载器负责加载 Java 的扩展类库,如 javax 包中的类。
3. Application ClassLoader:也称为 System ClassLoader,它是应用程序的默认类加载器。它负责加载应用程序的类和依赖的第三方类库。
Spring Boot 应用程序一般是通过 Application ClassLoader 加载的。它会在应用程序启动时将指定的主类加载到内存中,并解析该类的依赖关系。然后,它会递归地加载和解析这些依赖类,直到所有依赖都被加载完毕。加载后的类将被存放在 JVM 的方法区中,供应用程序运行时使用。
值得注意的是,Spring Boot 应用程序还可以使用自定义的类加载器。自定义类加载器可以扩展 Application ClassLoader 并实现特定的加载逻辑,以满足应用程序的需求。但是,在一般情况下,使用默认的类加载机制已经足够满足大多数应用程序的需求了。