千家信息网

Java中怎么实现一个类加载器

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Java中怎么实现一个类加载器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在虚拟机中其实类加载器有很多种,但主要分为下面的几种,它
千家信息网最后更新 2026年10月31日Java中怎么实现一个类加载器

Java中怎么实现一个类加载器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在虚拟机中其实类加载器有很多种,但主要分为下面的几种,它们分别是:

  • 启动类加载器

启动类加载器主要的功能是加载JAVA_HOME/lib目录中的所有类库。但它加载时有一个前提条件。就是虚拟机会按照指定的文件名来识别加载,例如rt.jar。如果名字不符合的类即使放到lib目录中启动类加载器也不会加载。启动类加载器无法被Java程序直接引用,原因是启动类加载器是用C++语言实现的。

  • 扩展类加载器

扩展类加载器的功能是加载JAVA_HOME/lib/ext目录下的所有类库。由于扩展类加载器是用Java语言本身实现的,所以用户可以直接使用扩展类加载器。

  • 应用程序类加载器

应用程序类加载器的功能是加载用户类路径(ClassPath)上所指定的类库。用户也可以直接使用应用程序类加载器。通过下面的方式即可获取一个应用程序类加载器。

ClassLoader.getSystemClassLoader();

如果程序中没有自定义类加载器,那么应用程序类加载器就为该程序的默认类加载器。

  • 自定义类加载器

自定义类加载器顾名思义就是用户自己开发的类加载器,Java API中提供了一些API可以帮助我们开发出自己的类加载器。

  • 双亲委派模型

在上面我们提到了,在类加载器中双亲委派模型是非常重要的,那么到底什么是双亲委派模型呢?其实在上述这些类加载器中类加载器与类加载器之间都具有某种层次关系,这种关系就叫双亲委派模型。我们先看一下下面的图,然后在做具体说明。

在类加载器中规定除了最顶层的启动类加载器外,其它的所有类加载器都必须有自己的父类加载器。如图中显示,自定义类加载器的父类加载器就是应用程序类加载器,应用程序类加载的器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。那这么做的目的是什么呢?为什么要有这种层次关系呢?

下面我们看一下双亲委派模型的工作流程。如果一个类加载器收到了一个类的加载请求,首先它不会去加载这个类,而是把这个请求委派给父类加载器,并且每一个类加载器都是如此,所以无论加载的哪一个类最终一定是会委派给启动类加载器加载的,因为上述的委派规则。只有父类加载器无法加载时(该类加载器在它自己的范围内没有搜索到该类)子类加载器才会尝试自己去加载这个类。虽然我们知道了上述类加载器的工作流程,也就是双亲委派模型,那它到底对Java应用程序到底有什么重要的性呢?下面我们举一个简单的例子,来说明一下双亲委派模式的好处。

在有双亲委派模式下,启动类加载器可以抢在扩展类加载器之前去加载类。扩展类加载器可以在应用程序类加载器之前加载类。应用程序类加载器可以在自定义类加载器之前加载类。这样在双亲-孩子委派链中,启动类加载器是最可信任的-核心Java API它会检查每一个被加载的类,然后依次到扩展类加载器、应用程序类加载器、自定义类加载器。如果假如自定义类加载器试图加载一个java.lang.Virus(病毒类)时会怎么样呢?

按照双亲委派模型。这个类会一直委派到启动类加载器来加载这个类 ,因为启动类加载器是核心的Java API 。在java.lang这个包中,没有这个类,所以不能加载。按照双亲委派模型当父类加载器不能加载时,子类加载器尝试加载。依次类推,其它的类加载器也不能加载这个类。于是由用户自定义的类加载器来加载这个类。如果自定义类加载器成功加载了这个类。因为Java允许同一个包中有彼此访问的权限,所以这个java.lang.Virus这个类就允许访问java.lang包下所有类的权限,并且可以利用这个特殊的访问权限来做一些不可告人的目的。这显示是非常不安全的操作。那么类加载器怎么保证Java程序的运行安全呢?

类加载器除了有上述的一些特性外,还有其它的特性来保证,防止这个代码访问java.lang包中的其它类的访问权限。Java虚拟机是怎么实现的呢?

因为在Java虚拟机中只把彼此访问的特殊权限授予同一个类加载器加载到同一个包中的类型。因此 java.lang包的中的类是由启动类加载器加载的,而java.lang.Virus是由自定义类加载器加载的。所以这些类型不属于同一个运行时包。

运行时包:它指由同一个类加载器加载的,属于同一个包的,多个类型集合。

Java虚拟机在允许两个类属于同一个包进行访问之前,Java虚拟机不但要确定它们属于同一个包,还必须确认它们属于同一个运行时包(必须由同一个类加载器加载)。所以java.lang.Virus类不能访问java.lang包下的权限。这样就保证了Java程序的运行安全。

关于Java中怎么实现一个类加载器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

程序 委派 应用程序 应用 双亲 模型 权限 用户 运行 安全 功能 就是 是由 目录 类型 问题 面的 保证 帮助 特殊 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州百单互联网科技有限公司 科技服务与互联网 互联网科技媒体 互联网科技视频 苏州互联网科技贷款公司 左右互联网络科技 互联网科技股有哪些 科技赋能互联网健康 北京三清互联网科技 江苏南京365互联网科技 银川新华互联网科技职业技术培训学校图片 栖莱科技互联网股份有限公司 昊天互联网科技有限公司 宝灵互联网科技有限公司 互联网媒体平台算高科技产业 世界互联网领先科技成果获奖 浙南科技城互联网大厦招聘 互联网科技股为什么大涨 东营紫格互联网科技 全球科技与互联网公司市值变化 上海睿民互联网科技有限公司 互联网是第几次科技革命的成果 互联网科技大会案例 美国互联网前沿科技 卫星互联网科技股票 农村开互联网科技讲堂 广州慧亚互联网科技怎么样 互联网科技创新服务 翼展科技 首家互联网医院 领航科技大厦互联网公司
0