alipay sofa-ark-1.1.5 各种类加载器 优先级

.

各种类加载器 & 优先级

/*** <pre>*     类加载器的使用优先级(由高到底)*          0、JDKDelegateClassLoader*          1、ContainerClassLoader*          2、hook级别类{前置}加载器*          3、PluginClassLoader*          4、BizClassLoader(当前类加载器)*          5、AgentClassLoader、systemClassLoader*          6、hook级别的{后置}类加载器* </pre>** <pre>*      systemClassLoader*          继承:父类加载器是extClassLoader*          初始化在:{@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#init()}*          用途:1、加载systemClassLoader领域的类;2、加载extClassLoader领域的类**      JDKDelegateClassLoader*          继承:父类加载器是extClassLoader*          实例化在:{@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#init()}*          用途:1、加载"java.home"路径下的jar包的类;2、加载extClassLoader领域的类**      AgentClassLoader*          继承:没有父类加载器*          实例化在:{@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#createAgentClassLoader()}*          用途:用于加载{agent}领域的类**      ContainerClassLoader【ArkClassLoader】*          继承:没有父类加载器*          实例化在:{@link com.alipay.sofa.ark.bootstrap.AbstractLauncher#createContainerClassLoader(com.alipay.sofa.ark.spi.archive.ContainerArchive)}*          用途:用于加载{ark-container}领域的类**      BizClassLoader*          继承:没有父类加载器*          实例化在:{@link com.alipay.sofa.ark.container.service.biz.BizFactoryServiceImpl#createBiz(com.alipay.sofa.ark.spi.archive.BizArchive)}*          用途:用于加载{业务}领域的类**      PluginClassLoader*          继承:没有父类加载器*          实例化在:{@link com.alipay.sofa.ark.container.service.plugin.PluginFactoryServiceImpl#createPlugin(com.alipay.sofa.ark.spi.archive.PluginArchive)}*          用途:用于加载{插件}领域的类* </pre>*/

.

BizClassLoader

/*** <pre>*     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#loadClass(java.lang.String name, boolean)*     {*         @see com.alipay.sofa.ark.container.service.classloader.BizClassLoader#loadClassInternal(java.lang.String name, boolean)*         {*             Class<?> clazz = null;**             // 0. sun reflect related class throw exception directly【即:检查是否是{sun类}】*             if (classloaderService.isSunReflectClass(name)) {*                 throw new ArkLoaderException(String.format("[ArkBiz Loader] %s : can not load class: %s, this class can only be loaded by sun.reflect.DelegatingClassLoader", bizIdentity, name));*             }**             // 1. findLoadedClass 查看{当前类加载器}是否已经加载过*             if (clazz == null) {*                 clazz = findLoadedClass(name);*                 {*                     @see java.lang.ClassLoader#findLoadedClass(java.lang.String)*                 }*             }**             // 2. JDK related class 解析的是jdk的类 【即:尝试使用{jdk类加载器}加载类】*             // 加载"java.home"路径下的jar包的类,父类加载器是extClassLoader。*             // 使用的还是递归机制 !!! 所以,如果被加载了extClassLoader,那么子类加载器,就必须共用类,做不到隔离功能。*             if (clazz == null) {*                 clazz = resolveJDKClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveJDKClass(java.lang.String)*                          // !!! JDKDelegateClassLoader 的初始化,见 {@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#init()}*                          @see com.alipay.sofa.ark.container.service.classloader.JDKDelegateClassLoader#loadClass(java.lang.String)*                 }*             }**             // 3. Ark Spi class 内置的类 【即:尝试使用{ContainerClassLoader}加载类】*             if (clazz == null) {*                 clazz = resolveArkClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveArkClass(java.lang.String)*                          // !!! classloaderService.getArkClassLoader() == arkClassLoader ==== ContainerClassLoader 容器级别的类加载器*                          // !!! arkClassLoader 的初始化 {@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#init()}*                          if (classloaderService.isArkSpiClass(name) //  "com.alipay.sofa.ark.spi"*                              || classloaderService.isArkApiClass(name) // "com.alipay.sofa.ark.api"*                              || classloaderService.isArkLogClass(name) // "com.alipay.sofa.ark.common.log"*                              || classloaderService.isArkExceptionClass(name) // "com.alipay.sofa.ark.exception"*                          ) {*                              try {*                                  return classloaderService.getArkClassLoader().loadClass(name);*                              } catch (ClassNotFoundException e) {*                                  // ignore*                              }*                          }*                          return null;*                 }*             }**             // 4. pre find class 前置操作【即:尝试使用{hook级别类{前置}加载器}加载类】*             if (clazz == null) {*                 clazz = preLoadClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.BizClassLoader#preLoadClass(java.lang.String)*                         // 获取spi文件com.alipay.sofa.ark.spi.service.classloader.ClassLoaderHook中,key为biz-classloader-hook的配置*                 }*             }**             // 5. Plugin Export class 【即:尝试使用{plugin级别类加载器}加载类】*             if (clazz == null) {*                 clazz = resolveExportClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveExportClass(java.lang.String)*                          boolean shouldFindExportedClass = shouldFindExportedClass(name);*                          {*                              @see com.alipay.sofa.ark.container.service.classloader.BizClassLoader#shouldFindExportedClass(java.lang.String className)*                                  // bizIdentity === "alipay-sofaark-biz:1.0-SNAPSHOT";**                                  // 不是{拒绝导入}的类*                                  return !classloaderService.isDeniedImportClass(bizIdentity, className);*                                  {*                                      @see com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#isDeniedImportClass(java.lang.String, java.lang.String)*                                          // 获取{业务模块}对象*                                          Biz biz = bizManagerService.getBizByIdentity(bizIdentity);*                                          if (biz == null) {*                                              return false;*                                          }**                                          // xxx-ark-biz.jar的pom.xml中配置的,命中类规则*                                          for (String pattern : biz.getDenyImportClasses()) {*                                              if (pattern.equals(className)) {*                                                  return true;*                                              }*                                          }**                                          // xxx-ark-biz.jar的pom.xml中配置的,命中包规则*                                          String pkg = ClassUtils.getPackageName(className);*                                          for (String pattern : biz.getDenyImportPackageNodes()) {*                                              if (pkg.equals(pattern)) {*                                                  return true;*                                              }*                                          }**                                          // xxx-ark-biz.jar的pom.xml中配置的,命中包规则*                                          for (String pattern : biz.getDenyImportPackageStems()) {*                                              if (pkg.startsWith(pattern)) {*                                                  return true;*                                              }*                                          }**                                          return false;*                                  }*                          }**                          // 不是{拒绝导入}的类,那么使用{plugin级别的类加载器}尝试加载*                          if (shouldFindExportedClass) {*                              ClassLoader importClassLoader = classloaderService.findExportClassLoader(name);*                              {*                                  @see com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#findExportClassLoader(java.lang.String)*                                      // 类的加载器*                                      // exportClassAndClassLoaderMap,居于{插件的Manifest}进行初始化,见 {@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#prepareExportClassAndResourceCache()}*                                      ClassLoader exportClassLoader = exportClassAndClassLoaderMap.get(className);**                                      // 包的加载器*                                      String packageName = ClassUtils.getPackageName(className);*                                      if (exportClassLoader == null) {*                                          // exportNodeAndClassLoaderMap,居于{插件的Manifest}进行初始化,见 {@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#prepareExportClassAndResourceCache()}*                                          exportClassLoader = exportNodeAndClassLoaderMap.get(packageName);*                                      }**                                      // 包的加载器*                                      while (!Constants.DEFAULT_PACKAGE.equals(packageName) && exportClassLoader == null) {*                                          // exportStemAndClassLoaderMap,居于{插件的Manifest}进行初始化,见 {@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#prepareExportClassAndResourceCache()}*                                          exportClassLoader = exportStemAndClassLoaderMap.get(packageName);*                                          packageName = ClassUtils.getPackageName(packageName);*                                      }*                                      return exportClassLoader;*                              }*                              if (importClassLoader != null) {*                                  try {*                                      return importClassLoader.loadClass(name);*                                  } catch (ClassNotFoundException e) {*                                      // just log when debug level*                                      if (ArkLoggerFactory.getDefaultLogger().isDebugEnabled()) {*                                          // log debug message*                                          ArkLoggerFactory.getDefaultLogger().debug("Fail to load export class " + name, e);*                                      }*                                  }*                              }*                          }*                          return null;*                 }*             }**             // 6. Biz classpath class 业务类加载器【即:尝试使用{当前类加载器}加载类】*             if (clazz == null) {*                 clazz = resolveLocalClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveLocalClass(java.lang.String)*                          @see java.lang.ClassLoader#loadClass(java.lang.String, boolean)*                 }*             }**             // 7. Java Agent ClassLoader for agent problem,*             // agent类加载器,即:"-javaagent:"声明的路径 【即:尝试使用{agent的类加载器}加载类】*             if (clazz == null) {*                 clazz = resolveJavaAgentClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveJavaAgentClass(java.lang.String)*                          try {*                              // agentClassLoader 实例化,见 {@link com.alipay.sofa.ark.container.service.classloader.ClassLoaderServiceImpl#createAgentClassLoader()}*                              classloaderService.getAgentClassLoader().loadClass(name);*                              {*                                  @see com.alipay.sofa.ark.container.service.classloader.AgentClassLoader#loadClass(java.lang.String)*                              }**                              return classloaderService.getSystemClassLoader().loadClass(name);*                              {*                                  // 系统(app)类加载器加载*                              }*                          } catch (ClassNotFoundException e) {*                              // ignore*                          }*                          return null;*                 }*             }**             // 8. post find class 后置操作【即:尝试使用{hook级别的{后置}类加载器}加载类】*             if (clazz == null) {*                 clazz = postLoadClass(name);*                 {*                     @see com.alipay.sofa.ark.container.service.classloader.BizClassLoader#postLoadClass(java.lang.String)*                 }*             }**             // 解析类*             if (clazz != null) {*                 if (resolve) {*                     super.resolveClass(clazz);*                     {*                         @see java.lang.ClassLoader#resolveClass(java.lang.Class)*                     }*                 }*                 return clazz;*             }**             throw new ArkLoaderException(String.format("[ArkBiz Loader] %s : can not load class: %s", bizIdentity, name));*         }**         @see com.alipay.sofa.ark.container.service.classloader.PluginClassLoader#loadClassInternal(java.lang.String name, boolean)*     }* </pre>*/

.

PluginClassLoader

/**** <pre>*     @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#loadClass(java.lang.String name, boolean)*     {*         @see com.alipay.sofa.ark.container.service.classloader.PluginClassLoader#loadClassInternal(java.lang.String, boolean)*              Class<?> clazz = null;**              // 0. sun reflect related class throw exception directly【即:检查是否是{sun类}】*              if (classloaderService.isSunReflectClass(name)) {*                  throw new ArkLoaderException(String.format(*                       "[ArkPlugin Loader] %s : can not load class: %s, this class can only be loaded by sun.reflect.DelegatingClassLoader", pluginName, name));*              }**              // 1. findLoadedClass 查看{当前类加载器}是否已经加载过*              if (clazz == null) {*                  clazz = findLoadedClass(name);*              }**              // 2. JDK related class 解析的是jdk的类 【即:尝试使用{jdk类加载器}加载类】*              // 加载"java.home"路径下的jar包的类,父类加载器是extClassLoader。*              // 使用的还是递归机制 !!! 所以,如果被加载了extClassLoader,那么子类加载器,就必须共用类,做不到隔离功能。*              if (clazz == null) {*                  clazz = resolveJDKClass(name);*              }**              // 3. Ark Spi class 内置的类 【即:尝试使用{ContainerClassLoader}加载类】*              if (clazz == null) {*                  clazz = resolveArkClass(name);*                  {*                      @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveArkClass(java.lang.String)*                          // !!! classloaderService.getArkClassLoader() == arkClassLoader ==== ContainerClassLoader 容器级别的类加载器*                  }*              }**              // 4. pre find class 前置操作【即:尝试使用{hook级别{前置}类加载器}加载类】*              if (clazz == null) {*                  clazz = preLoadClass(name);*              }**              // 5. Import class export by other plugins 【即:尝试使用{plugin级别类加载器}加载类】,即:有其他plugin加载*              if (clazz == null) {*                  clazz = resolveExportClass(name);*                  {*                      @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveExportClass(java.lang.String)*                  }*              }**              // 6. Plugin classpath class 【即:尝试使用{当前类加载器}加载类】*              if (clazz == null) {*                  clazz = resolveLocalClass(name);*                  {*                       @see com.alipay.sofa.ark.container.service.classloader.AbstractClasspathClassLoader#resolveLocalClass(java.lang.String)*                          try {*                              return super.loadClass(name, false);*                          } catch (ClassNotFoundException e) {*                              // ignore*                          }*                          return null;*                  }*              }**              // 7. Java Agent ClassLoader for agent problem*              // agent类加载器,即:"-javaagent:"声明的路径 【即:尝试使用{agent的类加载器}加载类】*              if (clazz == null) {*                  clazz = resolveJavaAgentClass(name);*              }**              // 8. Post find class 后置操作【即:尝试使用{hook级别的{后置}类加载器}加载类】*              if (clazz == null) {*                  clazz = postLoadClass(name);*              }**              // 解析类*              if (clazz != null) {*                  if (resolve) {*                      super.resolveClass(clazz);*                  }*                  return clazz;*              }**              throw new ArkLoaderException(String.format("[ArkPlugin Loader] %s : can not load class: %s", pluginName, name));*     }* </pre>*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp分包

以下是一个完整的 Uniapp 分包示例&#xff0c;代码分布在不同的文件夹中&#xff0c;其中包含了两个子包 sub1 和 sub2&#xff0c;以及一个主包 main。 在项目根目录下创建 pages 文件夹&#xff0c;并在其中创建各个页面的文件夹。 在每个页面文件夹中创建对应的 vue 文件和…

【SSD1306 OLED屏幕测试程序 (开源)orangepi zero2 全志H616 】.md updata: 23/11/07

orangepi zero2 H616 SSD1306 OLED屏幕测试程序 orangepi zero2 配置wiringpi 库后&#xff0c;突发奇想构建一个测试oled屏幕的程序&#xff0c;放一个蜗牛每次移动一个像素点&#xff0c;实时显示蜗牛的步数&#xff0c;后面要显示其他内容在此代码上修改即可&#xff0c;如…

flask和fastapi的区别以及demo实现

flask和fastapi的区别以及demo实现 flask和fastapi的区别fastapi简单demoFastAPI包括全局异常捕捉和参数验证的demoflask和fastapi的区别 Flask:Flask是一个轻量级的Web框架,它提供了最基本的工具,可以自由选择其他库和组件来构建应用。灵活性:Flask允许用户自由选择数据库、…

NLP之BM25:BM25算法的简介、相关库、案例应用之详细攻略

NLP之BM25:BM25算法的简介、相关库、案例应用之详细攻略 目录 相关文章 NLP之BM25:BM25算法的简介、相关库、案例应用之详细攻略 Py之rank_bm25:rank_bm25的简介、安装、使用方法 BM25算法的简介

智慧农业:农林牧数据可视化监控平台

数字农业是一种现代农业方式&#xff0c;它将信息作为农业生产的重要元素&#xff0c;并利用现代信息技术进行农业生产过程的实时可视化、数字化设计和信息化管理。能将信息技术与农业生产的各个环节有机融合&#xff0c;对于改造传统农业和改变农业生产方式具有重要意义。 图扑…

Android Studio(项目收获)

取消按钮默认背景色 像按钮默认背景色为深蓝色&#xff0c;即使使用了background属性指定颜色也不能生效。 参考如下的解决方法&#xff1a; 修改/res/values/themes.xml中的指定内容如下&#xff1a; <style name"Theme.TianziBarbecue" parent"Theme.Mater…

OSCP系列靶场-Esay-Dawn

总结 getwebshell → SMB共享无密码 → SMB存在上传功能 → 存在周期执行任务 → SMB上传反弹shell → 被执行获得webshell 提 权 思 路 → suid发现zsh → -p容器提权 准备工作 启动VPN 获取攻击机IP > 192.168.45.163 启动靶机 获取目标机器IP > 192.168.242.11 信…

51单片机-定时计数器

文章目录 前言1 原理2.编程 前言 1 原理 2.编程 定时计算&#xff1a; 50ms501000us 一个机器周期&#xff1a;1.085us 65535 - 501000/1.08546082 故 40082*1.08549998.97 /*定时器1&#xff0c;定时模式 工作模式1 16位计数器&#xff0c; 定时20秒后使能蜂鸣器*/ #include…

luckysheet的使用——13.开启表格非编辑模式(指定单元格可编辑,除此以外其他单元格全部不可编辑)

对指定单元格进行设置为可编辑&#xff0c;在开启非编辑模式后&#xff0c;只有指定的单元格才可以进行编辑&#xff0c;其余单元格全部无法编辑。 1.修改系统&#xff0c;在对应的前端页面代码中对右键菜单新增功能&#xff1a; {title: 设置可编辑,onClick: function (click…

5 Tensorflow图像识别(下)模型构建

上一篇&#xff1a;4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理&#xff0c;下面是完整的代码&#xff1a; import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…

Elasticsearch 8.9 服务端接收创建索引和查询索引信息源码

一、创建索引1、接收创建索引的RestCreateIndexAction2、Master执行创建索引的类TransportCreateIndexAction3、创建一个任务(创建索引的)&#xff0c;放入一个队列4、执行创建索引时会先搜索模版5、创建索引的build&#xff0c;更新集群状态(1) initializeEmpty初始化索引的分…

AI+BI行业数字化转型研讨会 - 总结精华回顾

带您一起观看研讨会精彩内容回顾&#xff01; || 导语 AIBI行业数字化转型研讨会—引领未来&#xff0c;智慧转型 德昂信息技术(北京)有限公司于2023年10月26日成功举办了AIBI行业数字化转型研讨会。此次盛会汇聚了产业精英、企业领袖以及技术专家&#xff0c;共同探讨在快速…

Python的编码规范:PEP 8介绍及基本遵循原则

文章目录 PEP 8简介基本遵循原则1. 缩进2. 行宽3. 空行4. 导入5. 空格6. 命名约定7. 表达式和语句中的空格8. 注释9. 编码声明10. 文档字符串PEP 8简介 PEP 8,或Python Enhancement Proposal 8,是一个官方文档,发布于2001年。它由Guido van Rossum,Python语言的创始人,以…

sed过滤线上日志,根据时间段查询

文章目录 语法: sed -n ‘/开始时间:/,/结束时间:/p’ 文件名 例1 sed -n /2023-11-08 11:30:*/,/2023-11-08 11:31:*/p server.log例2&#xff08;根据上面的继续过滤也行&#xff09; sed -n /2023-11-08 11:29:*/,/2023-11-08 11:31:*/p e-chatbot-server.log | grep appSav…

前端框架Vue学习 ——(二)Vue常用指令

文章目录 常用指令 常用指令 指令: HTML 标签上带有 “v-” 前缀的特殊属性&#xff0c;不同指令具有不同含义。例如: v-if, v-for… 常用指令&#xff1a; v-bind&#xff1a;为 HTML 标签绑定属性值&#xff0c;如设置 href&#xff0c;css 样式等 <a v-bind:href"…

Spark 新特性+核心回顾

Spark 新特性核心 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 1. 掌握Spark的Shuffle流程 1.1 Spark Shuffle Map和Reduce 在Shuffle过程中&#xff0c;提供数据的称之为Map端&#xff08;Shuffle Write&#xff09;接收数据的称之为Reduce端&#xff08;Sh…

MybatisPlus之新增操作并返回主键ID

在应用mybatisplus持久层框架的项目中&#xff0c;经常遇到执行新增操作后需要获取主键ID的场景&#xff0c;下面将分析及测试过程记录分享出来。 1、MybatisPlus新增方法 持久层新增方法源码如下&#xff1a; public interface BaseMapper<T> extends Mapper<T> …

js处理赎金信

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&…

自动控制原理--面试问答题

以下文中的&#xff0c;例如 s_1 为 s下角标1。面试加油&#xff01; 控制系统的三要素&#xff1a;稳准快。稳&#xff0c;系统最后不能震荡、发散&#xff0c;一定要收敛于某一个值&#xff1b;快&#xff0c;能够迅速达到系统的预设值&#xff1b;准&#xff0c;最后稳态值…

一台电脑生成两个ssh,绑定两个GitHub账号

背景 一般一台电脑账号生成一个ssh绑定一个GitHub&#xff0c;即一一对应的关系&#xff01;我之前有一个账号也配置了ssh&#xff0c;但是我想经营两个GitHub账号&#xff0c;当我用https url clone新账号的仓库时&#xff0c;直接超时。所以想起了配置ssh。于是有了今天这篇…