对ClassLoader的一些思考

目录

目标

加载顺序

parent委派

自定义顺序

隔离

运行时增加或更新


目标

基于classloader的作用,思考使用场景。

加载顺序

parent委派

这是classloader默认加载顺序,简述为'检查自己是否加载过,委派给parent去加载,自己加载'。

可能引起的问题,加载的class不是期望的class。

自定义顺序

自定义classLoader并重写loadClass,在其中制定各种类加载器的执行顺序。

用图直观表示自定义加载顺序的几种方式。

隔离

每个类加载器具有其负责的资源范围,利用该特性,可以达到资源隔离的目的。

隔离结合自定义顺序,这就是某些公司环境隔离中间件的思想。

运行时增加或更新

需要运行时增加或更新class的系统,一般是具有通用性逻辑的系统,通过扩展点承载业务多样化和个性化。

在设计上,必然需要解耦‘系统流程’与‘业务扩展流程’。可以采用扩展管理层作为中间层,管理业务与classLoader上下文的关系、执行行为等。

例如一种加载方式:

 

需要考虑的事情

  • 供扩展点使用的扩展接口的规范
    • 定位扩展接口实现类方式
              如固定的全路径和行为,规定class全路径为a.b.c.D,接口名称\返回类型\入参类型,扩展方按照规范去定义
              如固定标识和扩展接口,实现类全路径不限定,必需实现特定接口,注解或接口设置唯一标识
    • 提供入参和返回值的实现体,规范性,便于系统流程使用
    • 扩展接口的唯一性标识,用于标记实现类
  • 扩展者唯一性标识,例如业务标识
  • 扩展者具有独立classloader,利用隔离性
  • 扩展的版本,起到标识作用
  • 维护context,用于管理,路由
    • 扩展者:扩展包:版本:独立classloader
    • 扩展者:class全路径:Class
    • 扩展者:class全路径:实例
  • 更新扩展包
    • 新建独立classloader
    • [规范性检查] [加载jar中所有class] [实例化特定扩展接口]
    • 取代旧的classloader
  • 清空上一版本context
  • 规定扩展接口实现类的scope仅限管理器内部,否则可能导致无法垃圾回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值