Java中的类加载器用于将class文件加载到JVM中。Java中主要有三种类加载器:bootstrap class loader(启动类加载器)、extension class loader(扩展类加载器)和system class loader(系统类加载器)。其中扩展类加载器和系统类加载器统称为应用程序类加载器。
Java类加载器与双亲委派机制
Java中的类加载器用于将class文件加载到JVM中。Java中主要有三种类加载器:bootstrap class loader(启动类加载器)、extension class loader(扩展类加载器)和system class loader(系统类加载器)。其中扩展类加载器和系统类加载器统称为应用程序类加载器。
双亲委派机制是指当一个类加载器要加载一个类时,会先让其父类加载器进行加载,如果父类加载器无法完成加载,才会由当前类加载器加载。这一机制的好处是保证了类的唯一性,避免了类被重复加载。例如,所有类的根加载器都是bootstrap class loader,在根加载器中创建的类是所有类最基础的类,因此如果一个类没有指定任何加载器的话,会默认由bootstrap class loader进行加载。
线程上下文类加载器专项解读分析
为了支持一些动态扩展的基础库,Java新引入了线程上下文类加载器的概念。当线程调用某个类时,JVM会按照双亲委派机制来加载类。但是,在某些特殊情况下,我们需要使用一些不在当前类加载器的搜索路径下的类,这时就可以通过设置线程上下文类加载器来加载这些类。
以下是一个示例代码,通过设置线程上下文类加载器来加载指定路径下的类:
Class<?> loadClass(String name, String path){
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
URL[] urls = { new URL("file:"+path) };
URLClassLoader urlClassLoader = new URLClassLoader(urls, cl);
Thread.currentThread().setContextClassLoader(urlClassLoader);
return Class.forName(name);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
上述代码首先获得当前线程的上下文类加载器,然后通过新建一个URLClassLoader来加载指定路径下的类,并将其设置为当前线程的上下文类加载器。最后可以通过Class.forName()方法来获取指定名称的类。
本文标题为:Java类加载器与双亲委派机制和线程上下文类加载器专项解读分析
基础教程推荐
- 在Ubuntu使用SQL Server创建Go应用程序的图文教程 2023-07-29
- 教你一招永久解决mysql插入中文失败问题 2023-08-06
- 一起了解了解MySQL存储引擎 2023-08-12
- mysql数据库sql优化原则(经验总结) 2023-12-02
- sql with as用法详解 2023-12-29
- 全链路监控平台Pinpoint SkyWalking Zipkin选型对比 2023-12-29
- CentOS 7.9服务器Java部署环境配置的过程详解 2023-12-03
- Django中更改默认数据库为mysql的方法示例 2023-12-02
- Spring Boot整合MyBatis连接Oracle数据库的步骤全纪录 2023-12-03
- 数据库之SQL技巧整理案例 2023-12-11
