当前位置: 首页 > article >正文

JVM类加载高阶实战:从双亲委派到弹性架构的设计进化

前言

        作为Java开发者,我们都知道JVM的类加载机制遵循"双亲委派"原则。但在实际开发中,特别是在金融支付、插件化架构等场景下,严格遵循这个原则反而会成为系统扩展的桎梏。本文将带你深入理解双亲委派机制的本质,并分享如何在金融级系统中优雅地突破这一限制。

一、双亲委派机制的本质

1.1 什么是双亲委派

        双亲委派模型(Parents Delegation Model)是JVM类加载的基础规则,其核心流程可以概括为:

  1. 收到类加载请求后,先不尝试自己加载
  2. 逐级向上委托给父加载器
  3. 父加载器无法完成时才自己尝试加载

1.2 源码解析

查看ClassLoader的loadClass方法实现:

protected Class<?> loadClass(String name, boolean resolve) {synchronized (getClassLoadingLock(name)) {// 1.检查是否已加载Class<?> c = findLoadedClass(name);if (c == null) {try {// 2.父加载器不为空则委托父加载器if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 父加载器找不到类时不处理}// 3.父加载器找不到时自己加载if (c == null) {c = findClass(name);}}return c;}
}

二、核心价值

1、双亲委派的核心价值‌

维度

价值体现

典型场景案例

安全性

防止核心API被篡改(如java.lang包)

避免自定义String类导致JVM崩溃

稳定性

保证基础类唯一性,避免多版本冲突

JDK核心库的统一加载

资源效率

避免重复加载类,减少Metaspace消耗

公共库(如commons-lang)共享

架构简洁性

形成清晰的类加载责任链

容器与应用的类加载分层

2、突破双亲委派的核心价值

突破方向

技术价值

业务价值

典型实现案例

逆向委派

1. 解决基础库与实现类的加载器逆向调用问题

2. 保持核心库纯净性

1. 实现开箱即用的扩展架构

2. 降低厂商接入成本

JDBC驱动加载

SLF4J日志门面

平行加载

1. 打破类唯一性约束

2. 建立隔离的类空间

1. 支持灰度发布

2. 实现业务无感升级

推荐算法AB测试

支付渠道多版本共存

热加载

1. 打破类加载的单次性原则

2. 实现运行时字节码替换

1. 分钟级故障修复

2. 业务规则实时生效

促销策略热更新

风控规则动态调整

精细控制

1. 细粒度类加载策略

2. 安全权限精确管控

1. 多租户资源隔离

2. 第三方代码安全执行

SaaS插件系统

云函数执行环境

3、核心价值对比

特性

双亲委派模型

突破双亲委派模型

安全性

高,防止核心API被篡改

需要额外安全控制

稳定性

高,避免类重复加载

可能引发类冲突

灵活性

低,严格层级限制

高,可定制加载逻辑

适用场景

标准Java应用

框架扩展、多版本共存等特殊需求

三、关键技术详解

1、SPI服务发现机制(逆向委派)

原理‌:服务提供者接口(SPI)机制中,核心库接口由启动类加载器加载,而实现类由应用类加载器加载,形成了父加载器请求子加载器加载类的逆向委派。

应用场景‌:JDBC驱动加载、日志框架实现等。

实现示例 - JDBC驱动加载‌:

  1. DriverManager(启动类加载器加载)调用ServiceLoader.load(Driver.class)
  2. 扫描META-INF/services下的实现类配置
  3. 使用线程上下文类加载器(通常为应用类加载器)加载具体驱动实现类

2、多版本隔离(平行加载)

原理‌:通过自定义类加载器实现同一类的不同版本并行加载,互不干扰。

应用场景‌:模块化系统、插件化架构。

实现示例 - OSGi模块系统‌:

  1. 每个Bundle(模块)拥有独立的类加载器
  2. 类加载时首先检查本Bundle的类路径
  3. 通过Import-Package声明依赖关系
  4. 不同Bundle可加载同一类的不同版本

3、热加载(动态更新)

原理‌:创建新的类加载器实例加载修改后的类,旧实例逐渐被GC回收。

应用场景‌:开发环境热部署、生产环境紧急修复。

实现示例 - Tomcat应用热部署‌:

  1. 检测到WEB-INF/classes或WEB-INF/lib变化
  2. 销毁当前WebappClassLoader
  3. 创建新的WebappClassLoader实例
  4. 重新加载应用类

4、精细控制(安全沙箱)

原理‌:通过自定义类加载器实现细粒度的类加载控制和隔离。

应用场景‌:多租户SaaS应用、第三方代码沙箱。

实现示例 - 插件安全沙箱‌:

  1. 为每个插件创建独立的类加载器
  2. 通过策略文件限制可访问的Java包
  3. 使用SecurityManager控制权限
  4. 插件间通过定义良好的接口通信

四 、电商行业应用场景

场景1:多商户定制化(SPI机制)

需求背景‌:电商平台需要支持不同商户定制支付、物流等模块的实现。

实现步骤‌:

  1. 定义标准服务接口
  2. 商户实现接口并打包为JAR
  3. 将JAR放入指定目录
  4. 平台通过SPI机制动态加载实现

项目结构示例

// 项目结构示例
payment-core/          // 核心模块(含SPI接口)
  └── src/main/resources/META-INF/services/
       └── com.example.PaymentService  // 空文件payment-alipay/        // 支付宝实现JAR
  └── src/main/resources/META-INF/services/
       └── com.example.PaymentService  // 内容:com.example.AlipayImpl payment-wechat/        // 微信实现JAR
  └── src/main/resources/META-INF/services/
       └── com.example.PaymentService  // 内容:com.example.WechatImpl

核心代码‌:

// 1. 定义SPI接口(标准策略模式)
public interface PaymentService {boolean pay(String merchantId, BigDecimal amount);
}// 2. META-INF/services配置
// 文件:META-INF/services/com.example.PaymentService
// 内容:
// com.example.AlipayServiceImpl  # 商户A的支付宝实现
// com.example.WechatPayImpl      # 商户B的微信实现// 3. 商户路由逻辑(工厂+策略组合)
public class PaymentRouter {private final Map<String, PaymentService> merchantProviders = new ConcurrentHashMap<>();public void init() {ServiceLoader<PaymentService> loader = ServiceLoader.load(PaymentService.class);// 注册所有实现(自动发现)loader.forEach(provider -> {String merchantType = provider.getSupportedMerchantType();merchantProviders.put(merchantType, provider);});}public boolean processPayment(String merchantId, BigDecimal amount) {// 根据商户ID获取对应支付策略String merchantType = getMerchantType(merchantId);PaymentService service = merchantProviders.get(merchantType);return service.pay(merchantId, amount);}
}

场景2:AB测试框架(多版本隔离)

需求背景‌:需要同时运行商品推荐算法的不同版本进行AB测试。

实现步骤‌:

  1. 为每个算法版本创建独立类加载器
  2. 加载相同接口的不同实现
  3. 根据用户分组路由请求

核心代码‌:

/*** AB测试框架核心实现 - 多版本隔离测试系统* 主要功能:支持多版本并行测试,确保版本间完全隔离运行* 实现步骤:*   1. 实验配置注册*   2. 版本隔离存储*   3. 流量分配执行*/
public class ABTestFramework {// 实验配置存储(线程安全)// key: 实验ID,value: 实验对象private Map<String, Experiment> experiments = new ConcurrentHashMap<>();/*** 步骤1:注册实验版本(核心配置方法)* @param expId 实验唯一标识符 * @param version 版本号(如"A"、"B")* @param impl 版本对应的实现逻辑*/public void registerVersion(String expId, String version, Runnable impl) {// 使用computeIfAbsent保证线程安全experiments.computeIfAbsent(expId, k -> new Experiment()).addVersion(version, impl); // 将版本添加到对应实验}/*** 步骤3:执行流量分配(核心路由方法)* @param expId 要执行的实验ID* @param userId 用户唯一标识(用于稳定分流)*/public void execute(String expId, String userId) {Experiment exp = experiments.get(expId);if (exp != null) {// 基于用户ID的哈希值进行稳定分流int hash = Math.abs(userId.hashCode());// 取模计算分配到的版本String version = exp.getVersion(hash % exp.versionCount());// 隔离执行选定版本exp.runVersion(version); }}/*** 实验容器内部类(实现版本隔离存储)*/private static class Experiment {// 版本顺序列表(保持注册顺序)private final List<String> versions = new ArrayList<>();// 版本实现映射(线程安全)private final Map<String, Runnable> implementations = new ConcurrentHashMap<>();/*** 步骤2:添加版本实现(同步控制)* @param ver 版本标识* @param impl 版本实现*/synchronized void addVersion(String ver, Runnable impl) {if (!versions.contains(ver)) {versions.add(ver);implementations.put(ver, impl);}}/*** 执行指定版本(隔离运行)* @param ver 要执行的版本号*/void runVersion(String ver) {implementations.get(ver).run();}// 获取版本数量int versionCount() {return versions.size();}// 根据索引获取版本号String getVersion(int index) {return versions.get(index);}}
}

使用示例

ABTestFramework framework = new ABTestFramework();
// 注册A/B版本
framework.registerVersion("login_btn", "A", () -> showRedButton());
framework.registerVersion("login_btn", "B", () -> showBlueButton());
// 执行测试
framework.execute("login_btn", "user123"); 

场景3:促销规则热更新(热加载)

需求背景‌:大促期间需要频繁调整促销规则而不重启服务。

实现步骤‌:

  1. 监控规则文件变更
  2. 创建新类加载器加载更新后的规则类
  3. 平滑切换到新实现

核心代码‌:

// 1. 规则接口定义(策略模式)
public interface PromotionRule {String getRuleId();  // 规则唯一标识double apply(double price); // 应用规则计算
}// 2. 热加载管理器
public class RuleHotLoader {private Map<String, PromotionRule> ruleMap = new ConcurrentHashMap<>();// 监听配置文件变化public void watchRuleDir(String dirPath) {WatchService watcher = FileSystems.getDefault().newWatchService();Paths.get(dirPath).register(watcher, ENTRY_MODIFY);new Thread(() -> {while (true) {WatchKey key = watcher.take(); // 阻塞等待文件变化reloadRules(dirPath); // 触发重载key.reset();}}).start();}// 3. 动态加载规则类private void reloadRules(String dirPath) throws Exception {URLClassLoader loader = new URLClassLoader(new URL[]{new File(dirPath).toURI().toURL()},this.getClass().getClassLoader());// 扫描jar包中的规则实现ServiceLoader<PromotionRule> sl = ServiceLoader.load(PromotionRule.class, loader);sl.forEach(rule -> ruleMap.put(rule.getRuleId(), rule));}
}// 4. 使用示例
RuleHotLoader loader = new RuleHotLoader();
loader.watchRuleDir("/rules"); // 监控规则目录// 获取最新规则并应用
PromotionRule rule = loader.getRule("discount_50");
double finalPrice = rule.apply(100); // 应用50%折扣

场景4:第三方插件安全隔离(安全沙箱)

需求背景‌:允许第三方开发者提供数据分析插件,但需确保系统安全。

实现步骤‌:

  1. 定义插件接口和沙箱策略
  2. 为每个插件创建独立类加载器
  3. 配置SecurityManager限制权限
  4. 通过接口与插件交互

核心代码‌:

import java.security.*;/*** 安全沙箱实现 - 限制第三方插件权限* 实现步骤:* 1. 自定义安全管理器限制危险操作* 2. 使用独立ClassLoader隔离类加载* 3. 通过反射机制执行插件代码*/
public class Sandbox {// 1. 自定义安全管理器(核心安全控制)private static class PluginSecurityManager extends SecurityManager {@Overridepublic void checkPermission(Permission perm) {// 禁止所有文件写操作if (perm instanceof FilePermission && !perm.getActions().equals("read")) {throw new SecurityException("文件写入被禁止: " + perm);}// 禁止网络访问if (perm instanceof SocketPermission) {throw new SecurityException("网络访问被禁止: " + perm);}// 禁止退出JVMif (perm instanceof RuntimePermission && "exitVM".equals(perm.getName())) {throw new SecurityException("禁止终止JVM");}}}// 2. 隔离的ClassLoader实现private static class PluginClassLoader extends URLClassLoader {public PluginClassLoader(URL[] urls) {super(urls, getSystemClassLoader().getParent()); // 父级为扩展类加载器}@Overrideprotected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {// 禁止加载java.*包下的类(安全隔离关键)if (name.startsWith("java.")) {throw new SecurityException("禁止加载系统类: " + name);}return super.loadClass(name, resolve);}}/*** 3. 安全执行插件方法* @param pluginPath 插件jar路径* @param className 插件主类名* @param methodName 执行方法名*/public static void executePlugin(String pluginPath, String className, String methodName) {// 备份原安全管理器SecurityManager oldSM = System.getSecurityManager();try {// 设置自定义安全管理器System.setSecurityManager(new PluginSecurityManager());// 创建隔离的ClassLoaderPluginClassLoader loader = new PluginClassLoader(new URL[]{new File(pluginPath).toURI().toURL()});// 加载并执行插件Class<?> pluginClass = loader.loadClass(className);Method method = pluginClass.getMethod(methodName);method.invoke(pluginClass.newInstance());} catch (Exception e) {System.err.println("插件执行失败: " + e.getMessage());} finally {// 恢复原安全管理器System.setSecurityManager(oldSM);}}// 使用示例public static void main(String[] args) {executePlugin("/path/to/plugin.jar","com.example.PluginMain","run");}
}

五、总结

        从架构设计角度看,双亲委派模型与突破该模型的策略代表了软件设计中"规范"与"灵活"的辩证关系。优秀的架构师应当:

  1. 理解规则本质‌:深入掌握双亲委派的安全保障机制
  2. 识别突破场景‌:准确判断何时需要打破常规
  3. 控制突破边界‌:通过设计模式(如桥接、策略)封装变化
  4. 保障系统稳定‌:建立完善的测试和监控机制

在电商这类复杂业务系统中,合理运用类加载机制能够实现:

  • 业务模块的动态扩展
  • 多版本并行运行
  • 关键功能热修复
  • 第三方代码安全隔离

最终达到系统在稳定性和灵活性之间的最佳平衡点。

相关文章:

JVM类加载高阶实战:从双亲委派到弹性架构的设计进化

前言 作为Java开发者&#xff0c;我们都知道JVM的类加载机制遵循"双亲委派"原则。但在实际开发中&#xff0c;特别是在金融支付、插件化架构等场景下&#xff0c;严格遵循这个原则反而会成为系统扩展的桎梏。本文将带你深入理解双亲委派机制的本质&#xff0c;并分享…...

[网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发

文章目录 数据库数据库设计配置 MyBatis1. Spring 配置2. 创建实体类3. 创建 Mapper 接口4. 使用 MyBatis 约定前后端交互接口登录接口注册接口获取用户信息 服务器开发loginregistergetUserInfo完整代码 数据库 数据库设计 完成注册登录以及用户分数管理 使用数据库来保存上…...

maven编译时跳过test过程

如果代码里有无法在打包环境中测试的部分&#xff0c;则直接运行mvn clean package&#xff0c;因为测试失败&#xff0c;会导致打包失败。目前有两种方式可以跳过测试&#xff1a; 1. mvn clean package -DskipTests&#xff0c;这会跳过执行阶须&#xff0c;但仍会生成测试所…...

threejsPBR材质与纹理贴图

1. PBR材质简介 本节课没有具体的代码&#xff0c;就是给大家科普一下PBR材质&#xff0c;所谓PBR就是&#xff0c;基于物理的渲染(physically-based rendering)。 Three.js提供了两个PBR材质相关的APIMeshStandardMaterial和MeshPhysicalMaterial,MeshPhysicalMaterial是Mes…...

深兰科技董事长陈海波受邀出席2025苏商高质量发展(常州)峰会,共话AI驱动产业升级

5月29日&#xff0c;2025苏商高质量发展峰会在常州隆重开幕。本次峰会聚焦新质生产力培育与产业创新转型&#xff0c;汇聚了众多江苏省内知名企业家、专家学者及政府代表。深兰科技创始人、董事长陈海波作为人工智能领域的领军企业代表&#xff0c;受邀出席盛会并参与重要活动环…...

【计算机网络】子网划分

文章目录 【计算机网络】子网划分&#xff08;知识点详细&#xff09;一、子网划分基础概念1. **为什么需要子网划分&#xff1f;**2. **关键术语** 二、子网划分核心原理1. **借位规则**2. **子网划分步骤** 三、子网划分实战案例案例1&#xff1a;标准C类网划分&#xff08;等…...

Git入门到精通:30分钟掌握核心技巧

目录 一、基础理论片 Git简介 Git安装 Git仓库 Git基本命令用法 仓库别名 二、实操命令篇 远程分支 分支的新建和合并 实操演示 1 本地新建仓库 2 gitee新建仓库 3 建立关系 4 新建分支 5 开发新功能 6 推送新分支 7 合并新分支到主分支 三、可视化工具篇 G…...

Redis7底层数据结构解析

redisObject 在 Redis 的源码中&#xff0c;Redis 会将底层数据结构&#xff08;如 SDS、hash table、skiplist 等&#xff09;统一封装成一个对象&#xff0c;这个对象叫做 redisObject&#xff0c;也简称 robj。 typedef struct redisObject {unsigned type : 4; // 数…...

Android 异步编程中协程的完整实战示例

一、全链路数据加载&#xff1a;网络请求 数据库缓存 在实际开发中&#xff0c;数据加载通常需要先检查本地缓存&#xff0c;若缓存失效则从网络获取&#xff0c;并将结果更新到本地。以下是完整的 MVVM 架构示例&#xff1a; 1. 项目结构 app/ ├── data/ …...

多部手机连接同一wifi的ip一样吗?

在家庭和办公环境中&#xff0c;多台手机同时连接同一个WiFi路由器已成为常态。不少用户会产生疑问&#xff1a;这些设备的IP地址会相同吗&#xff1f;下面就一起来了解一下吧。 一、多部手机连接同一WiFi的IP‌一样吗 多部手机连接同一WiFi时的IP地址是否相同&#xff0c;需要…...

大语言模型值ollama使用(1)

ollama为本地调用大语言模型提供了便捷的方式。下面列举如何在windows系统中快捷调用ollama。 winR打开运行框&#xff0c;输入cmd 1、输入ollama list 显示已下载模型 2、输入ollama pull llama3 下载llama3模型 3、 输入 ollama run llama3 运行模型 4、其他 ollama li…...

大模型应用开发之Langchain

一、框架简述 Langchain 是一个用于构建和管理 LLM 应用的开发框架。它为开发者提供了工具和接口&#xff0c;以便于更轻松地将大语言模型集成到应用程序中&#xff0c;并处理语言模型生成的响应、管理对话状态、执行链式调用、处理多步任务等。 二、Langchain主要模块 1、M…...

thc-ssl-dos:SSL 压力测试的轻量级工具!全参数详细教程!Kali Linux教程!

简介 THC-SSL-DOS 是一款用于验证 SSL 性能的工具。 建立安全的 SSL 连接需要服务器比客户端高 15 倍的处理能力。 THC-SSL-DOS 利用这种不对称特性&#xff0c;通过使服务器过载并使其断网。 此问题影响当今所有 SSL 实现。供应商自 2003 年以来就已意识到这个问题&#x…...

什么是内网ip证书

内网IP证书是一种基于公钥基础设施&#xff08;PKI&#xff09;技术的数字证书&#xff0c;专门用于保护企业内部网络中通过IP地址访问服务的通信安全。以下是对内网IP证书的详细解析&#xff1a; 一、核心定义与用途 定义&#xff1a;内网IP证书是SSL/TLS证书的一种特殊类型…...

【速通RAG实战:进阶】17、AI视频打点全攻略:从技术实现到媒体工作流提效的实战指南

一、AI视频打点的技术底层与数据处理流程 (一)视频内容结构化的核心技术栈 AI视频打点的本质是将非结构化视频数据转化为带时间戳的结构化信息,其技术流程涵盖音视频处理、语音识别、自然语言处理三大核心模块,形成“数据采集-内容解析-智能标记-协同应用”的完整闭环。 …...

立控信息智能装备柜:科技赋能军队装备管理现代化

在军事装备管理领域&#xff0c;高效、安全、智能化的存储解决方案至关重要。传统的人工管理模式不仅效率低下&#xff0c;还容易因人为疏忽导致装备丢失或管理混乱。​LKONE智能装备柜凭借先进的物联网技术、生物识别安全系统和智能管理功能&#xff0c;为军队提供了一套高效、…...

【freertos-kernel】queue(发送)

文章目录 补充各种yeildTCB的xStateListItem和xEventListItem xQueueGenericSendprvCopyDataToQueueprvNotifyQueueSetContainervTaskInternalSetTimeOutStatevTaskSuspendAllxTaskResumeAllprvLockQueueprvUnlockQueueprvIncrementQueueTxLockvTaskPlaceOnEventListprvAddCurr…...

【华为云物联网】如何实现在 MQTT.fx 上模拟数据间隔上传一次,并按设定系数变动数据

虽然 MQTT.fx 本身不支持定时循环脚本发送消息,但可以通过以下方式 实现在 MQTT.fx 上模拟设备参数每隔 1 分钟上传一次,并按设定系数变动数据: ✅ 推荐方式:使用 Python 脚本+MQTT.fx 联动观察 你将用 Python 自动发送数据,MQTT.fx 订阅对应主题观察是否发送成功。 🧩…...

破解高原运维难题:分布式光伏智能监控系统的应用研究

安科瑞刘鸿鹏 摘要 高原地区光照资源丰富&#xff0c;具有发展分布式光伏发电的巨大潜力。然而&#xff0c;该地区复杂的气候环境、地形地貌和运维条件对光伏电站的运行与维护带来严峻挑战。本文结合Acrel1000DP分布式光伏监控系统的技术特点和典型应用案例&#xff0c;探讨其…...

图标变白,开始菜单栏无法打开程序(以jupyter为例)

不知道是本人删了一些东西导致的还是什么原因&#xff0c;总之现在本人的jupyter只能通过命令行打开&#xff0c;以往我是从开始菜单栏打开。琢磨了一段时间&#xff0c;发现是.ico文件没有了。重新在网上下载图片&#xff0c;用网站图片转 ico 图标 - 锤子在线工具 转换一下格…...

大语言模型(LLM)入门 - (1) 相关概念

文章来自&#xff1a;大语言模型(LLM)小白入门自学项目-TiaoYu-1 GitHub - tiaoyu1122/TiaoYu-1: For People! For Freedom!For People! For Freedom! Contribute to tiaoyu1122/TiaoYu-1 development by creating an account on GitHub.https://github.com/tiaoyu1122/TiaoYu…...

行为型:访问者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 1、核心思想 目的&#xff1a;数据结构稳定的情况下&#xff0c;解决数据与算法的耦合问题。适用于对象结构稳定但需频繁扩展操作的场景。 实现&#xff1a;在访问数据时根据数据类…...

C++数据结构 : 哈希表的实现

C数据结构 &#xff1a; 哈希表的实现 目录 C数据结构 &#xff1a; 哈希表的实现引言1. 哈希概念1.1 直接定址法1.2 哈希冲突1.3 负载因子 2. 哈希函数2.1 除法散列法/除留余数法2.2 乘法散列法&#xff08;了解&#xff09;2.3 全域散列法&#xff08;了解&#xff09; 3. 处…...

抖音电商客户端一面面经

抖音电商客户端一面面经 时间&#xff1a; 25.05.30 岗位&#xff1a; 抖音电商客户端开发工程师 形式&#xff1a; 技术一面 刚刚结束了字节跳动抖音电商客户端开发工程师岗位的技术一面&#xff0c;整体感觉考察范围非常全面&#xff0c;涵盖了基础、项目、算法、系统设计等…...

JavaScript 在 AcroForm 中的广泛应用

在Adobe表单(特别是SAP Interactive Forms by Adobe)中使用JavaScript的各种技巧和方法,下面这些代码片段可以帮助开发者更高效地处理表单逻辑和交互。 1. 获取数据内容 从上下文结构中获取数据 var LV_DATA = xfa.resolveNode("$record.IM_TEST.FIELDNAME").val…...

Socket编程之TCP套件字

基于的TCP套件字编程流程 1. Socket套接字 Socket是一个编程接口&#xff08;网络编程接口&#xff09;&#xff0c;是一种特殊的文件描述符&#xff08;write/read&#xff09;。Socket并不 仅限于TCP/IP Socket独立于具体协议的编程接口&#xff0c;这个接口位于TCP/IP四层…...

AD9268、AD9643调试过程中遇到的问题

Ad9268芯片 AD9268是一款双通道、16位、80 MSPS/105 MSPS/125 MSPS模数转换器(ADC)。AD9268旨在支持要求高性能、低成本、小尺寸和多功能的通信应用。双通道ADC内核采用多级差分流水线架构&#xff0c;集成输出纠错逻辑。每个ADC都具有宽带宽、差分采样保持模拟输入放大器&…...

Java-File类基本方法使用指南

Java-File类基本方法使用指南 一、File类基础概念1.1 什么是File类1.2 File类的构造函数 二、文件和目录的创建与删除2.1 创建文件 - createNewFile()2.2 创建目录 - mkdir() 和 mkdirs()2.3 删除文件或目录 - delete() 三、文件和目录的查询与判断3.1 存在性判断 - exists()3.…...

Python爬虫实战:研究PyQuery库相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。如何高效地从海量的网页数据中提取有价值的信息,成为当前信息技术领域的一个重要研究方向。网络爬虫作为一种自动获取网页内容的程序,能够按照一定的规则,自动地抓取万维网信息,在搜索引擎…...

第九篇:MySQL 安全加固与访问控制策略实战

数据库的安全不仅仅是防止外部入侵&#xff0c;更包括合理配置账户权限、日志审计、网络加密、配置加固等。本文将系统性梳理 MySQL 的安全机制与实战加固方法&#xff0c;助你构建安全可靠的数据库运行环境。 一、数据库安全风险面 数据库常面临的威胁&#xff1a; 弱口令或默…...