首页 > 编程知识 正文

java编程思想,java自定义类加载器

时间:2023-05-04 23:25:03 阅读:32231 作者:1282

关注公众号并发送关键字,即可获得Github源的链接。 关键字:

类加载器源代码

1 .违背父母的任命

Java类加载器的实现采用父母委托原则,通过父母委托原则,我们可以很好地保护Java程序运行时的安全。 基础类加载到越高的类加载器(例如,启动类加载器)中,但此父代委托在某些情况下也是一个约束。 例如,如果我的基类需要调用用户单元实现的类,则无法加载用户单元实现的类,因为委派将委托给父类。 没有可加载的类加载器。 因此,调用将失败。 在这种情况下,必须打破此约束,以便父类加载器可以启动子类描述符以加载特定类。

实际上,这种情况已经存在于Java中,典型的例子是JDNI服务。 JDNI服务的代码由启动加载器加载,但在具体实现时需要调用每个制造商的具体实现,这些具体实现(SPI,服务提供者接口)存储在用户的类路径中

为了解决这个问题,Java引入了不太优雅的设计。 线程上下文类加载器。 可以在Thread.setContextClassLoader ()中设置此类加载器。 如果在创建线程时未设置,则从父线程继承;如果未全局设置,则缺省为APP应用程序类加载器。

2 .实现加载器

为了进一步巩固类加载器,我们特别实施了自己的类加载器。 此类加载器模拟服务加载器,服务加载器通常用于SPI机制。 这将打破父母委托机制,使父类加载器可以访问子类加载器加载的类。

实现大致可分为三个模块。

类加载器-核心:类加载器的核心实现

微信类加载器:由模拟制造商提供的具体实现

客户端:模拟我们的客户端,并使用供应商提供的具体实现

2.1类加载器核心

classloader-core有三个主要类:

驱动程序:接口,具体实现通过微信类加载器实现

驱动程序管理器:驱动程序管理类。 客户端使用它来检索特定的驱动程序并执行相关的方法

服务加载器:自定义的类加载器

将classloader-core模块设置为在运行时使用ExtClassLoader加载,并将他作为Java建议的规范。

2.1.1服务组长

服务加载器作为核心核心,我单独介绍。 服务加载器主要加载META-INF/sh-services/路径下所有接口的具体实现类,如下图所示。

此文件的内容是此接口的具体实现类,它只是演示了解整个类的加载过程,因此服务加载器的实现相对简单,既没有懒散的加载,也没有使用缓存。

核心:

final Class

服务属性:接口

finalclassloaderloader:thread.getcontextclassloader (),这里得到的是默认的AppClassLoader

2.2微信类加载器

驱动程序的具体实现,例如JDBC的jar包

2.3客户端

具体的APP应用程序是我们的APP应用程序使用classloader-core,微信class loader启动相应的类加载器。

客户端的时序图如下所示。

程序的执行

./gradlewbuild

#/users/sh/workspace/class loader/class loader-core/build/libs /此目录是class loader-core jar包所在的目录

Java-DJ ava.ext.dirs=$ Java _ home/JRE/lib/ext :/users/sh/workspace/class loader/class loader-core

结果如下。

这次的定制级加载器介绍到了这里。 下一期再见吧。

我是shysh95。 希望与你专注技术的道路并肩作战,长按识别或扫描码关注微信公众号,创作更多精彩文章。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。