Graalvm配置文件与Feature和Substitute机制介绍
GraalVM介绍
GraalVM提前将Java应用程序编译成独立与机器码二进制文件(可执行文件、动态库文件),如windows系统中的exe文件和dll文件。与在Java虚拟机(JVM)上运行的应用程序相比,这些二进制文件更小,启动速度快100倍,在没有预热的情况下提供峰值性能,并且使用更少的内存和CPU。
下面只介绍开发中与Graalvm相关的配置文件和扩展点(Feature和Substitute机制)以及maven插件配置。
1. 配置文件
1.1 动态代码配置文件
对于动态代码,需要通过指定的json文件来描述其metadata,这样GraalVM才能正确的编译和优化代码。如下类型
- 反射,配置文件名:reflect-config.json
- 动态代理, 配置文件名:proxy-config.json
- 资源文件, 配置文件名:resource-config.json
- JNI, 配置文件名:jni-config.json,配置被JNI代码调用的java方法,可见jni-lib模块
- 资源序列化, 配置文件名:serialization-config.json
- predefined classes, 配置文件名:predefined-classes-config.json
这些JSON文件内容格式可见github: graalvm json file schema
1.2 命令参数配置文件
graalvm推荐开发者为自己的项目提供文件名为native-image.properties的配置文件,在该配置文件中可指定native-image编译分析所需要的配置,在properties文件中,支持如下key:
- Args 配置native-image命令参数,如–feature指定扩展的Feature接口、–initialize-at-build-time指定编译时初始化的类。更多命令行选项见Command-line Options
- JavaArgs 配置native-image执行时的JVM参数
- ImageName 配置最后生成的可执行文件名称
关于native-image.properties的内容更多具体的可见文档Native Image Build Configuration
1.3 存放位置
配置文件都存放在项目jar文件的META-INF/native-image/目录下,native-image会自动加载该目录下的文件。如:
META-INF/
└── native-image└── native-image.properties└── reflect-config.json└── jni-config.json
为了防止多个jar文件内的配置冲突,graalvm推荐在META-INF/native-image/目录下新建以你项目的groupId/artifactID为子目录,如:
META-INF/
└── native-image└── groupID└── artifactID└── native-image.properties└── reflect-config.json└── jni-config.json
2. 动态代码配置示例
2.1 反射
- 类所有方法都可以用于反射,reflect-config.json配置如下
[{"name": "com.example.User","allDeclaredConstructors": true,"allPublicMethods": true,"allDeclaredFields": true}
]
- 类中指定方法和字段可用于反射,配置示例如下
[{"name": "com.example.User","fields": [{"name": "name"}],"methods": [{"name": "<init>","parameterTypes": []},{"name": "setName","parameterTypes": ["java.lang.String"]}]}
]
2.2 动态代理
- 假设接口
com.example.IPrintServic
会用于动态代理,proxy-config.json配置示例如下
[{"interfaces": ["com.example.IPrintService"]}
]
2.3 资源文件
假设有如下代码用于加载类路径下的资源
try(InputStream stream = this.getClass().getClassLoader().getResourceAsStream(“resource_config.properties”)) {//读取资源内容
}
resource-config.json配置示例如下
{"resources": {"includes": [{"pattern": "\\Qresource_config.properties\\E"}]}
}
说明: 上面pattern属性值为正则表达式,字符\Q
和\E
之间的内容在正则表达式中表示字面量,即对其中的特殊字符进行原始匹配,比如上面的.
不是匹配任意字符,而就是匹配字符串中的.
。
2.4 类序列化
如果项目中类com.example.User
使用了JDK的序列化方式,则其serialization-config.json配置示例如下
[{"name": "com.example.User"}
]
2.5 JNI中调JAVA API
如果JNI代码中有调com.example.Utils
类的public static int add(int,int)
方法,则jni-config.json配置示例如下
[
{"name":"com.example.Utils","methods":[{"name":"add","parameterTypes":["int","int"] }]
}
]
3. 扩展Feature接口
native-image生成可执行代码过程中会在关键步骤执行用户自定义代码,而用户代码的执行是通过graalvm的Feature机制实现的,开发者可以实现Feature接口来为程序设置一些特定行为,比如通过编码的方式设置以上动态代码配置。
示例
示例需求: 为com.example
包下注解了@Reflect
注解的类注册反射配置
- 实现Feature接口
public class ReflectFeature implements Feature {@Overridepublic void beforeAnalysis(BeforeAnalysisAccess access) {// 注册元数据try (ScanResult graph = new ClassGraph().overrideClassLoaders(access.getApplicationClassLoader()).overrideClasspath(access.getApplicationClassPath()).enableAllInfo().acceptPackages("com.example").scan()) {graph.getClassesWithAnnotation(Reflect.class).forEach(classInfo -> {Class clazz = classInfo.loadClass();RuntimeReflection.register(clazz);RuntimeReflection.registerForReflectiveInstantiation(clazz); // 可通过newInstance()方法创建,与allDeclaredConstructors=true类似RuntimeReflection.register(clazz.getDeclaredFields()); // allDeclaredFields=true类似RuntimeReflection.register(clazz.getDeclaredMethods());// allPublicMethods=true类似});}}
}
注:以上包扫描使用classgraph工具,它与其它反射工具相比优势在于它是直接解析字节码来进行匹配的,好处就是不用把类加载到JVM中。classgraph的maven配置如下:
<dependency><groupId>io.github.classgraph</groupId><artifactId>classgraph</artifactId><version>4.8.173</version>
</dependency>
- 注册自定义的
com.example.feature.ReflectFeature
接口
有两种方式,- 方式一:在native-image命令行使用参数配置
--features=com.example.feature.ReflectFeature
指定 - 方式二:推荐在native-image.properties文件配置,内容如下
Args = --features=com.st.graalvm.feature.StepTrackFeature
- 方式一:在native-image命令行使用参数配置
4. Substitute机制
Substitute替换机制使得可以在不修改源代码的前提下,对运行时行为进行适配改造,以保持对原API的兼容。 GraalVM本身也通过该机制对JDK API做了很多兼容性替换。
基于该机制,开发者也可以根据实际需求对一些类、方法、字段甚至是构造函数在native-image编译过程中进行替换。
替换通过注解来实现,native-image编译过程会扫描这些特定注解的类,替换类必须为final类型,命名格式推荐为Target_{原类包名}_{原类名}
。
替换机制提供的注解如下
-
@TargetClass 注解替换类,其value值为被替换类
-
@Substitute 注解替换方法,被注解的方法在方法名和签名上需与目标方法一致
-
@Alias 注解在替换字段上,被注解的字段在名称和签名上需与目标字段一致,
- 搭配**@InjectAccessors**注解可拦截字段的get和set方法,示例如下
@Alias @InjectAccessors(Target_OriginClass_Version_value.class) private static String version; static class Target_OriginClass_Version_value {private static String versionValue;static String getVersion() {if (versionValue == null) {versionValue = "44444444L_substitute";}return versionValue;}static void setVersion(String value) {System.out.println("setVersion:" + value);} }
- 搭配**@RecomputeFieldValue**注解可替换字段的值,示例如下
// 替换静态字段,需设置isFinal=true @Alias @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) private static boolean useNative = true; // 替换字段 @Alias @RecomputeFieldValue(kind = Kind.FromAlias) private boolean inited = true;
-
@Inject 注解在替换类的字段上,该字段在被替换类中不存在,需搭配
@RecomputeFieldValue
注解,示例如下
@TargetClass(OriginClass.class)
public final class Target_com_example_OriginClass {// 替换并设置字段值@Alias @InjectAccessors(Target_OriginClass_Type_value.class)private TypeEnum type;@Inject @RecomputeFieldValue(kind = Kind.Reset)private TypeEnum typeValue;static class Target_OriginClass_Type_value {static TypeEnum getType(Target_OriginClass receiver) {if (receiver.typeValue == null) {receiver.typeValue = TypeEnum.SUBSTITUTE;}return receiver.typeValue;}static void setType(Target_OriginClass receiver, TypeEnum value) {receiver.typeValue = value;}}
}
5. maven编译打包配置
<plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>0.10.2</version><extensions>true</extensions><executions><execution><id>build-native</id><goals><goal>compile-no-fork</goal></goals><phase>package</phase></execution><execution><id>test-native</id><goals><goal>test</goal></goals><phase>test</phase></execution></executions><configuration><imageName>${project.artifactId}</imageName><sharedLibrary>false</sharedLibrary><metadataRepository><enabled>true</enabled></metadataRepository></configuration>
</plugin>
6. 其它特性
- 创建动态库供C/C++,可见文档Build a Native Shared Library
- JAVA代码可以直接调动态库接口,不过java代码需要经过native-image编译后才能运行
- 创建JNI接口,在之前JNI接口实现都是C/C++编写,使用native-image可以直接使用JAVA来编写JNI接口实现,可见文档JNI Invocation API
- 与其它语言集成(包含的语言有JS/Node.js、Python、R、Ruby、WebAssembly、LLVM语言),在Truffle基础上实现,可见文档Embedding Languages
工具
1. 使用native-image-agent代理库生成metadata文件
如果不清楚应用中有哪些动态代码需要提供配置,可以使用graalvm提供native-image-agent来跟踪代码执行情况来生成metadata文件,只需要在java启动参数中加上-agentlib:native-image-agent
参数即可,命令示例如下
java -agentlib:native-image-agent=config-output-dir=graalvm -jar graalvm-1.0-SNAPSHOT.jar
总结
- Java语言的动态特性阻碍了native-image静态分析和编译,开发者需要提供相应的配置文件native-image才能完整的识别出需要静态编译的代码。
- Feature机制和替换机制为开发者提供了在编译期间尽可能多的控制
- 通过native-image不仅可以把应用编译为可执行文件,也可以把公共库编译为动态库供其它语言调用,还可以把公共库通过JNI接口暴露给其它java程序使用。
相关文章:
Graalvm配置文件与Feature和Substitute机制介绍
GraalVM介绍 GraalVM提前将Java应用程序编译成独立与机器码二进制文件(可执行文件、动态库文件),如windows系统中的exe文件和dll文件。与在Java虚拟机(JVM)上运行的应用程序相比,这些二进制文件更小,启动速…...
Appium adb 获取appActivity
方法一(最简单有效的方法) 通过cmd命令,前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …...
调整分区失败致盘无法访问:深度解析与数据恢复全攻略
调整分区失败盘打不开的困境 在计算机的日常维护与管理中,调整磁盘分区是常见的操作之一,旨在优化存储空间布局、提升系统性能或满足特定应用需求。然而,当这一操作未能如预期般顺利进行,反而导致分区调整失败,进而使…...
试用笔记之-汇通计算机等级考试软件一级Windows
首先下载汇通计算机等级考试软件一级Windows http://www.htsoft.com.cn/download/htwork.rar...
Java的NIO体系
目录 NIO1、操作系统级别下的IO模型有哪些?2、Java语言下的IO模型有哪些?3、Java的NIO应用场景?相比于IO的优势在哪?4、Java的IO、NIO、AIO 操作文件读写5、NIO的核心类 :Buffer(缓冲区)、Channelÿ…...
自下而上的选股与自上而下的选股
一起学习了《战胜华尔街》,不知道大家有没有这么一种感受:林奇的选股方法是典型的自下而上的选股方法。虽然这一点没有单独拎出来讨论过,但在《从低迷中寻找卓越》《如何通过财务指标筛选股票?》《边逛街边选股?》《好…...
Tech Talk:智能电视eMMC存储的五问五答
智能电视作为搭载操作系统的综合影音载体,以稳步扩大的市场规模走入越来越多的家庭,成为人们生活娱乐的重要组成部分。存储部件是智能电视不可或缺的组成部分,用于保存操作系统、应用程序、多媒体文件和用户数据等信息。智能电视使用eMMC作为…...
scikit-learn教程
scikit-learn(通常简称为sklearn)是Python中最受欢迎的机器学习库之一,它提供了各种监督和非监督学习算法的实现。下面是一个基本的教程,涵盖如何使用sklearn进行数据预处理、模型训练和评估。 1. 安装和导入包 首先确保安装了…...
CentOS 7 搭建rsyslog日志服务器
CentOS 7 搭建rsyslog日志服务器 前言一、IP地址及主机名称规划1.修改主机名 二、配置rsyslog日志服务器1.安装rsyslog服务2.编辑/etc/rsyslog.conf 文件3.启动并启用rsyslog服务4.验证端口是否侦听 三、在rsyslog日志服务器上配置firewalld防火墙四、配置rsyslog日志客户端1.编…...
使用Spring Boot Actuator监控应用健康状态
使用Spring Boot Actuator监控应用健康状态 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何利用Spring Boot Actuator来监控和管理应用程序的…...
leetcode刷题:vector刷题
🔥个人主页:guoguoqiang. 🔥专栏:leetcode刷题 1.只出现一次的数字 这道题很简单,我们只需要遍历一次数组即可通过异或运算实现。(一个数与自身异或结果为0,任何数与0异或还是它本身) class Solut…...
CGI面试题及参考答案
什么是CGI?它在Web服务器与应用程序之间扮演什么角色? CGI(Common Gateway Interface) 是一种标准协议,它定义了Web服务器与运行在服务器上的外部程序(通常是脚本或应用程序)之间的通信方式。简单来说,CGI充当了一个桥梁,使得Web服务器能够将用户的请求传递给后端程序…...
论文调研_物联网漏洞检测综述
A Review of IoT Firmware Vulnerabilities and Auditing Techniques 研究背景:物联网设备在工业、消费类等各个领域得到了广泛应用,实现了更高的自动化和生产率。然而,这些连网设备的高度依赖也带来了一系列网络安全威胁,特别是…...
Java学习【IO流:深入理解与应用(上)】
Java学习【IO流:深入理解与应用(上)】 🍃1.IO流体系结构🍃2.FileOutputStream🍁2.1FileOutputStream写数据的三种方式🍁2.2换行和续写 🍃3.FileInputStream🍁3.1每次读取…...
干货系列:SpringBoot3第三方接口调用10种方式
环境:SpringBoot.3.3.0 1、简介 在项目中调用第三方接口是日常开发中非常常见的。调用方式的选择通常遵循公司既定的技术栈和架构规范,以确保项目的一致性和可维护性。无论是RESTful API调用、Feign声明式HTTP客户端、Apache HttpClient等调用方式&…...
KVM性能优化之CPU优化
1、查看kvm虚拟机vCPU的QEMU线程 ps -eLo ruser,pid,ppid,lwp,psr,args |awk /^qemu/{print $1,$2,$3,$4,$5,$6,$8} 注:vcpu是不同的线程,而不同的线程是跑在不同的cpu上,一般情况,虚拟机在运行时自身会点用3个cpus,为保证生产环…...
lua中判断2个表是否相等
当我们获取 table 长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度,而且还会出现奇怪的现象。例如:t里面有3个元素,但是因为最后一个下表是5和4,却表现出不一…...
uni-app 自定义支付密码键盘
1.新建组件 payKeyboard .vue <template><view class"page-total" v-show"isShow"><view class"key-list"><view class"list" v-for"(item,index) in keyList" :class"{special:item.keyCode190…...
抖音微短剧小程序源码搭建:实现巨量广告数据高效回传
在数字化营销日益盛行的今天,抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力,还能有效提升品牌的知名度和用户黏性。然而,想要充分利用这一营销工具,关键在于如何高效地追踪广告数…...
springboot数字化医院产科系统源码
目录 一、系统概述 二、开发环境 三、功能设计 四、功能介绍 一、系统概述 数字化产科是为医院产科量身定制的信息管理系统。它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。该系统由门诊系统、住院系统、数据统计模块三部分组成,与医院HIS、LI…...
uniapp微信接口回调 response.sendRedirect nginx 报404错误
如题 参考 uniapp打包H5时,访问index.html页面白屏报错net::ERR_ABORTED 404 - 简书 nginx中修改 配置文件 location / { try_files $uri $uri/ /index.html; root html; index index.html index.htm; } uniapp里配置 重新载入...
Python系统教程02
巩固 input()输出函数 回顾 1 、 input()函数: 在 input()函数输入时,输入的内容一定为字符串类型。 2 、条件分支语句: 每一个 if 语句可以看成一个个体,elif 和 else 都是一个 if 个体的一部分,每一个 if 个体 运…...
JS面试题6——深拷贝和浅拷贝
它们都是用来复制的 1. 浅拷贝(只复制引用,而未复制真正的值) /* 简单赋值 */ var arr1 [a, b, c, d]; var arr2 arr1; /* Object.assign实现的也是浅拷贝 */ var obj1 {a:1, b:2} var obj2 Object.assign(obj1); 2. 深拷贝(是…...
Scrapy实现关键词搜索的数据爬取
爬虫技术对于从互联网上获取数据和信息非常重要,而scrapy作为一款高效、灵活和可扩展的网络爬虫框架,能够简化数据爬取的过程,对于从互联网上爬取数据的工作非常实用。本文将介绍如何使用scrapy实现关键词搜索的数据爬取。 Scrapy的介绍 Sc…...
【Linux】ip命令详解
Linux中的ip命令是一个功能强大的网络配置工具,用于显示或操作路由、网络设备、策略路由和隧道。以下是关于ip命令的详细解释: 一、ip命令介绍 简介:ip命令是一个用于显示或操作路由、网络设备、策略路由和隧道的Linux命令行工具。它取代了早期的ifconfig命令,并提供了更多…...
软降工程学系统实现
一、程序编码 程序编码是设计的继续,将软件设计的结果翻译成用某种程序设计语言描述的源代码。 程序编码涉及到方法、工具和过程。 程序设计风格和程序设计语言的特性会深刻地影响软件的质量和可维护性。 要求源程序具有良好的结构性和设计风格。 程序设计风格…...
001 SpringMVC介绍
文章目录 基础概念介绍BS和CS开发架构应用系统三层架构MVC设计模式 SpringMVC介绍SpringMVC是什么SpringMVC与Spring的联系为什么要学习SpringMVC 六大组件介绍六大组件(MVC组件其他三大组件)说明 基础概念介绍 BS和CS开发架构 一种是C/S架构,也就是客户端/服务器…...
深入解析scikit-learn中的交叉验证方法
交叉验证是机器学习中用于评估模型性能的重要技术,它可以帮助我们理解模型在未知数据上的泛化能力。scikit-learn(简称sklearn)是一个广泛使用的Python机器学习库,提供了多种交叉验证方法。本文将详细介绍scikit-learn中提供的交叉…...
分布式kettle调度管理平台简介
介绍 Kettle(也称为Pentaho Data Integration)是一款开源的ETL(Extract, Transform, Load)工具,由Pentaho(现为Hitachi Vantara)开发和维护。它提供了一套强大的数据集成和转换功能,…...
002-基于Sklearn的机器学习入门:基本概念
本节将继续介绍与机器学习有关的一些基本概念,包括机器学习的分类,性能指标等。同样,如果你对本节内容很熟悉,可直接跳过。 2.1 机器学习概述 2.1.1 什么是机器学习 常见的监督学习方法 2.1.2 机器学习的分类 机器学习一般包括监…...
ubuntu 默认的PATH配置
ubuntu 默认的PATH配置 在Ubuntu系统中,PATH环境变量是非常关键的,因为它定义了操作系统在接收到用户输入命令时,搜索可执行文件的目录顺序。这个变量的配置决定了哪些命令可以被系统全局识别和执行。 默认的PATH配置 Ubuntu的默认PATH环境…...
JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI
JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI孕产妇健康管理信息管理系统是一种将孕产妇健康管理信息进行集中管理和存储的系统。通过建立该系统,有助于提高孕产妇健康管理的效率和质量,减少医疗事故发生的…...
代码随想录算法训练营Day56|所有可达路径、797.所有可能的路径
所有可达路径 98. 所有可达路径 (kamacoder.com) 深度优先搜索,和之前的回溯题类似。 #include <iostream> #include <vector> using namespace std;// 定义一个二维向量来存储所有可能的路径 vector<vector<int>> paths; // 定义一个向…...
DNF手游鬼剑士攻略:全面解析流光星陨刀的获取与升级!云手机强力辅助!
《地下城与勇士》(DNF)手游是一款广受欢迎的多人在线角色扮演游戏,其中鬼剑士作为一个经典职业,因其强大的输出能力和炫酷的技能特效,吸引了众多玩家的青睐。在这篇攻略中,我们将详细介绍鬼剑士的一把重要武…...
npm创建一个空的vue3项目的方法或者pnpm创建vue3项目
1、前提我们已经安装了npm,或者pnpm 2、我们用npm来创建vue3项目 快速上手 | Vue.js 官网地址 这里我安装是的 node v18.20.3 以下是安装过程 : npm create vuelatest 根据自己的需要进行创建即可。 3、我们用pnpm来创建vite vue3项目 pnpm create …...
LSH算法:高效相似性搜索的原理与Python实现I
局部敏感哈希(LSH)技术是快速近似最近邻(ANN)搜索中的一个关键方法,广泛应用于实现高效且准确的相似性搜索。这项技术对于许多全球知名的大型科技公司来说是不可或缺的,包括谷歌、Netflix、亚马逊、Spotify…...
cesium 添加 Echarts图层(人口迁徒图)
cesium 添加 Echarts 人口迁徒图(下面附有源码) 1、实现思路 1、在scene上面新增一个canvas画布 2、通坐标转换,将经纬度坐标转为屏幕坐标来实现 3、将ecarts 中每个series数组中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代码 <!DOCTYPE html> <ht…...
Windows下快速安装Open3D-0.18.0(python版本)详细教程
目录 一、Open3D简介 1.1主要用途 1.2应用领域 二、安装Open3D 2.1 激活环境 2.2 安装open3d 2.3测试安装是否成功 三、测试代码 3.1 代码 3.2 显示效果 一、Open3D简介 Open3D 是一个强大的开源库,专门用于处理和可视化3D数据,如点云、网格和…...
无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages
ubuntu系统执行sudo apt update命令的时候,遇到如下问题: 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…...
最新CRMEB商城多商户java版源码v1.6版本+前端uniapp
CRMEB 开源商城系统Java版,基于JavaVueUni-app开发,在微信公众号、小程序、H5移动端都能使用,代码全开源无加密,独立部署,二开很方便,还支持免费商用,能满足企业新零售、分销推广、拼团、砍价、…...
【开发环境】MacBook M2安装git并拉取gitlab项目,解决gitlab出现Access Token使用无效的方法
文章目录 安装Homebrew安装git打开IDEA配置git打开IDEA拉取项目 安装Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"在iTerm等命令行工具打开后,输入上面的命令 之后根据中文提示完成Homebrew的下载…...
Flask-Session使用Redis
Flask-Session使用Redis 一、介绍 在Flask中,session数据默认是以加密的cookie形式存储在用户的浏览器中的。但是,真正的session数据应该存储在服务器端。Django框架会将session数据存储在数据库的djangosession表中,而Flask则可以通过第三…...
Redis缓存管理机制
在当今快节奏的数字世界中,性能优化对于提供无缝的用户体验至关重要。缓存在提高应用程序性能方面发挥着至关重要的作用,它通过将经常使用或处理的数据存储在临时高速存储中来减少数据库负载并缩短响应时间,从而减少系统的延迟。Redis 是一种…...
初学嵌入式是弄linux还是单片机?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“666”之后私信回复“666”,全部无偿共享给大家!!!1、先入门了51先学了89c52…...
【基础算法总结】分治—快排
分治—快排 1.分治2.颜色分类3.排序数组4.数组中的第K个最大元素5.库存管理 III 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.分治 分治…...
[C++]——同步异步日志系统(1)
同步异步日志系统 一、项⽬介绍二、开发环境三、核心技术四、环境搭建五、日志系统介绍5.1 为什么需要日志系统5.2 日志系统技术实现5.2.1 同步写日志5.2.2 异步写日志 日志系统: 日志:程序在运行过程中,用来记录程序运行状态信息。 作用&…...
python 第6册 辅助excel 002 批量创建非空白的 Excel 文件
---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法,从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码(A002.py 文件࿰…...
力扣61. 旋转链表(java)
思路:用快慢指针找到最后链表k个需要移动的节点,然后中间断开节点,原尾节点连接原头节点,返回新的节点即可; 但因为k可能比节点数大,所以需要先统计节点个数,再取模,看看k到底需要移…...
智慧园区综合平台解决方案PPT(75页)
## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0:以土地经营为主,成本驱动,提供基本服务。 2. 园区2.0:服务驱动,关注企业成长,提供增值服务。 3. 园区3.0:智慧型园区ÿ…...
Python只读取Excel文件的一部分数据,比如特定范围的行和列?
如何只读取Excel文件的一部分数据,比如特定范围的行和列? 在Python中,如果你只想读取Excel文件的特定范围,可以使用以下方法: pandas: Pandas是一个强大的数据处理库,它有一个内置函数read_excel()用于读…...