核心在于为每个SDK版本创建独立ClassLoader实例实现路径隔离与类型隔离,重写loadClass实现本地优先加载并安全委托系统类,统一接口由AppClassLoader加载以支持跨版本转型,再按设备、业务或请求特征动态路由。
核心在于让每个 sdk 版本拥有独立的类加载器实例,并通过统一接口层做运行时路由,而非编译期绑定。关键不是“加载多个 jar”,而是“隔离加载路径 + 动态识别版本 + 统一调用入口”。
为每个 SDK 版本分配专属 ClassLoader 实例
不能复用同一个自定义 ClassLoader 类,必须为不同版本创建独立实例:
- new SdkV1ClassLoader("/libs/sdk-v1.2.0/")
- new SdkV2ClassLoader("/libs/sdk-v2.4.1/")
- new SdkV3ClassLoader("/libs/sdk-v3.0.0-beta/")
每个实例对应唯一类路径,即使加载同名类(如 com.example.PaymentService),JVM 也视为完全不同的类型,静态字段、方法表、类型转换全部互不干扰。
重写 loadClass 实现“本地优先 + 安全委托”
必须打破双亲委派默认行为,避免高版本类被低版本 ClassLoader 错误加载:
- 在 loadClass(String name, boolean resolve) 开头调用 findLoadedClass(name) 查缓存
- 未命中则直接执行 findClass(name),从本实例指定路径读取字节码
- 仅当 findClass 明确抛出 ClassNotFoundException 时,才调用 super.loadClass 向上委托
这样既保证 SDK 内部类(如 SdkV2AuthInterceptor)只走本版本路径,又能让 java.util.Map、android.content.Context 等基础类安全交由系统类加载器处理。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
定义跨版本通用接口并由系统类加载器加载
所有 SDK 版本必须实现同一套公共接口,且该接口类不能打包进任何 SDK jar,而应放在主工程或 shared-api 模块中,由 AppClassLoader 加载:
- 例如定义 com.example.sdk.PaymentProcessor 接口
- v1.jar、v2.jar、v3.jar 分别提供自己的 PaymentProcessorImpl 实现类
- 主程序通过反射或工厂方法,用对应 ClassLoader 加载其实现类并转型为接口引用
由于接口类由系统类加载器加载,所有版本的实现类都能安全转型——这是跨版本调用成立的前提。
运行时按需路由到指定版本的实例
路由逻辑与业务规则强相关,常见方式有:
- 按设备/OS 特征路由:如 Android API Level ≥ 31 时加载 v3;HarmonyOS 4.0+ 加载专用适配版
- 按业务上下文路由:用户所属租户配置了 “sdk_version: v2”,则初始化时选用 SdkV2ClassLoader
- 按请求特征路由:HTTP Header 中含 X-SDK-Version: v2,则从缓存中取出已初始化的 v2 实例
建议将 ClassLoader 实例缓存为单例(按版本 key 管理),避免重复加载和内存泄漏;首次使用时触发初始化,后续直接复用。


















