CFR( Java 反编译器)
一、安装教程
CFR(Class File Reader)是一个流行的Java反编译器,它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程:
下载CFR
-
访问CFR的官方网站或GitHub仓库:CFR的最新版本和所有历史版本都可以在其GitHub仓库中找到。访问 CFR的GitHub页面。
-
选择版本并下载:在GitHub仓库中,点击“Releases”部分,找到你想要下载的版本。通常,你应该下载最新的稳定版本。点击对应版本旁边的
.jar文件链接进行下载。
使用CFR反编译.class文件
一旦你下载了CFR的.jar文件,你就可以使用Java命令行工具来运行它并反编译.class文件或.jar文件。确保你的计算机上已经安装了Java。
-
打开命令行工具:在Windows上,你可以使用CMD或PowerShell;在macOS或Linux上,使用Terminal。
-
使用CFR反编译
.class文件:在命令行中,导航到包含CFR.jar文件的目录。使用以下命令反编译单个.class文件:java -jar cfr-0.152.jar path/to/YourClass.class将
cfr-0.152.jar替换为你下载的CFR版本的实际文件名,将path/to/YourClass.class替换为你想要反编译的.class文件的路径。 -
使用CFR反编译
.jar文件:CFR也可以反编译整个.jar文件中的所有类。使用以下命令:java -jar cfr-0.152.jar path/to/your-archive.jar将
path/to/your-archive.jar替换为你想要反编译的.jar文件的路径。
高级用法
CFR提供了许多命令行选项,允许你定制反编译过程。例如,你可以控制是否显示局部变量名、是否解包枚举等。要查看所有可用的选项,运行:
java -jar cfr-0.152.jar --help
这将列出所有支持的选项及其描述。
注意事项
- 反编译的代码可能与原始源代码在某些细节上有所不同,特别是变量名和某些代码结构可能会因编译过程中的优化而改变。
- 使用反编译器查看代码主要用于学习和分析目的。如果你打算使用反编译的代码作为你自己的项目的一部分,请确保你有权这样做,以避免侵犯版权。
CFR是一个非常强大的工具,适用于需要深入理解编译后的Java代码的开发者。
二、使用帮助介绍
java -jar cfr-0.152.jar --help
2.1 help选项介绍
% java -jar cfr-0.152.jar --help
CFR 0.152--aexagg (boolean)--aexagg2 (boolean)--aggressivedocopy (int >= 0) default: 0--aggressivedoextension (boolean)--aggressiveduff (boolean)--aggressivesizethreshold (int >= 0) default: 13000--allowcorrecting (boolean) default: true--allowmalformedswitch (boolean)--analyseas (One of [DETECT, JAR, WAR, CLASS])--antiobf (boolean) default: false--arrayiter (boolean) default: true if class file from version 49.0 (Java 5) or greater--caseinsensitivefs (boolean) default: true--clobber (boolean)--collectioniter (boolean) default: true if class file from version 49.0 (Java 5) or greater--commentmonitors (boolean) default: false--comments (boolean) default: true--constobf (boolean) default: Value of option 'antiobf'--decodeenumswitch (boolean) default: true if class file from version 49.0 (Java 5) or greater--decodefinally (boolean) default: true--decodelambdas (boolean) default: true if class file from version 52.0 (Java 8) or greater--decodestringswitch (boolean) default: true if class file from version 51.0 (Java 7) or greater--dumpclasspath (boolean) default: false--eclipse (boolean) default: true--elidescala (boolean) default: false--extraclasspath (string)--forbidanonymousclasses (boolean) default: false--forbidmethodscopedclasses (boolean) default: false--forceclassfilever (string, specifying either java version as 'j6', 'j1.0', or classfile as '56', '56.65535')--forcecondpropagate (boolean)--forceexceptionprune (boolean)--forcereturningifs (boolean)--forcetopsort (boolean)--forcetopsortaggress (boolean)--forcetopsortnopull (boolean)--forloopaggcapture (boolean)--hidebridgemethods (boolean) default: Value of option 'obfattr'--hidelangimports (boolean) default: true--hidelongstrings (boolean) default: false--hideutf (boolean) default: true--ignoreexceptions (boolean) default: false--ignoreexceptionsalways (boolean) default: false--importfilter (string)--innerclasses (boolean) default: true--instanceofpattern (boolean) default: true if class file from version 60.0 (Java 16) or greater, or experimental in 58.0 (Java 14), 59.0 (Java 15)--j14classobj (boolean) default: false if class file from version 49.0 (Java 5) or greater--jarfilter (string)--labelledblocks (boolean) default: true--lenient (boolean) default: false--liftconstructorinit (boolean) default: true--lomem (boolean) default: false--methodname (string)--obfattr (boolean) default: Value of option 'antiobf'--obfcontrol (boolean) default: Value of option 'antiobf'--obfuscationpath (string)--outputdir (string)--outputencoding (string)--outputpath (string)--override (boolean) default: true if class file from version 50.0 (Java 6) or greater--previewfeatures (boolean) default: true--pullcodecase (boolean) default: false--recordtypes (boolean) default: true if class file from version 60.0 (Java 16) or greater, or experimental in 58.0 (Java 14), 59.0 (Java 15)--recover (boolean) default: true--recovertypeclash (boolean)--recovertypehints (boolean)--reducecondscope (boolean)--relinkconst (boolean) default: true--relinkconststring (boolean) default: Value of option 'relinkconst'--removebadgenerics (boolean) default: true--removeboilerplate (boolean) default: true--removedeadconditionals (boolean)--removedeadmethods (boolean) default: true--removeinnerclasssynthetics (boolean) default: true--rename (boolean) default: false--renamedupmembers (boolean) default: Value of option 'rename'--renameenumidents (boolean) default: Value of option 'rename'--renameillegalidents (boolean) default: Value of option 'rename'--renamesmallmembers (int >= 0) default: 0--sealed (boolean) default: true if class file from version 62.0 (Java 18) or greater, or experimental in 60.0 (Java 16), 61.0 (Java 17)--showinferrable (boolean) default: false if class file from version 51.0 (Java 7) or greater--showversion (boolean) default: true--silent (boolean) default: false--skipbatchinnerclasses (boolean) default: true--staticinitreturn (boolean) default: true--stringbuffer (boolean) default: false if class file from version 49.0 (Java 5) or greater--stringbuilder (boolean) default: true if class file from version 49.0 (Java 5) or greater--stringconcat (boolean) default: true if class file from version 53.0 (Java 9) or greater--sugarasserts (boolean) default: true--sugarboxing (boolean) default: true--sugarenums (boolean) default: true if class file from version 49.0 (Java 5) or greater--sugarretrolambda (boolean) default: false--switchexpression (boolean) default: true if class file from version 58.0 (Java 14) or greater, or experimental in 56.0 (Java 12), 57.0 (Java 13)--tidymonitors (boolean) default: true--trackbytecodeloc (boolean) default: false--tryresources (boolean) default: true if class file from version 51.0 (Java 7) or greater--usenametable (boolean) default: true--usesignatures (boolean) default: true--version (boolean) default: true--help (string)
Please specify '--help optionname' for specifics, e.g.
作用:
--aexagg和--aexagg2:控制异常聚合的程度,可能有助于简化生成的代码。--aggressivedocopy:更积极地复制代码片段,可能使反编译的代码更易于理解。--aggressivedoextension、--aggressiveduff:控制CFR在处理某些代码结构时的积极程度。--aggressivesizethreshold:设置积极处理代码的大小阈值。--allowcorrecting:允许CFR进行一些修正以提高代码准确性。--allowmalformedswitch:允许处理格式错误的switch语句。--analyseas:指定分析的类型(DETECT, JAR, WAR, CLASS)。--antiobf:针对混淆代码的处理。--arrayiter、--collectioniter:控制数组和集合迭代的处理。--caseinsensitivefs:文件系统大小写不敏感。--clobber:覆盖现有文件。--commentmonitors:在生成的代码中注释掉monitor语句。--comments:生成的代码中包含注释。--constobf:处理常量混淆。--decodeenumswitch、--decodefinally、--decodelambdas、--decodestringswitch:控制特定结构的反编译。--dumpclasspath:输出类路径。--eclipse:为Eclipse生成更友好的代码。--elidescala:省略Scala特定的代码。--extraclasspath:指定额外的类路径。--forbidanonymousclasses、--forbidmethodscopedclasses:禁止处理匿名类和方法作用域类。--forceclassfilever:强制指定类文件版本。--forcecondpropagate、--forceexceptionprune、--forcereturningifs、--forcetopsort、--forcetopsortaggress、--forcetopsortnopull:控制特定代码结构的处理方式。--forloopaggcapture:循环聚合捕获。--hidebridgemethods、--hidelangimports、--hidelongstrings、--hideutf:隐藏或省略代码中的特定部分。--ignoreexceptions、--ignoreexceptionsalways:忽略异常处理。--importfilter:过滤导入。--innerclasses:处理内部类。--instanceofpattern:处理instanceof模式匹配(Java 16+特性)。--j14classobj:处理Java 14的类对象。--jarfilter:过滤JAR文件中的类。--labelledblocks:标记代码块。--lenient:宽容模式。--liftconstructorinit:提升构造函数初始化。--lomem:低内存模式。--methodname:指定方法名。--obfattr、--obfcontrol:控制混淆属性。--obfuscationpath:指定混淆路径。--outputdir、--outputencoding、--outputpath:输出目录、编码和路径。--override:处理覆盖方法。--previewfeatures:启用预览特性。--pullcodecase:代码提取。--recordtypes:处理记录类型(Java 16+特性)。--recover、--recovertypeclash、--recovertypehints:恢复类型和提示。--reducecondscope:减少条件作用域。--relinkconst、--relinkconststring:重新链接常量。--removebadgenerics、--removeboilerplate、--removedeadconditionals、--removedeadmethods、--removeinnerclasssynthetics:移除无用代码。--rename、--renamedupmembers、--renameenumidents、--renameillegalidents、--renamesmallmembers:重命名标识符。--sealed:处理密封类(Java 17+特性)。--showinferrable:显示可推断的信息。--showversion:显示版本信息。--silent:静默模式。--skipbatchinnerclasses:跳过批处理内部类。--staticinitreturn:静态初始化返回。--stringbuffer、--stringbuilder、--stringconcat:字符串处理。--sugarasserts、--sugarboxing、--sugarenums、--sugarretrolambda:语法糖处理。--switchexpression:处理switch表达式(Java 12+特性)。--tidymonitors:整理监视器。--trackbytecodeloc:跟踪字节码位置。--tryresources:处理try-with-resources。--usenametable、--usesignatures:使用名称表和签名。--version:显示CFR版本。--help:显示帮助信息。
这些选项提供了对CFR反编译过程的细粒度控制,允许用户根据需要调整反编译的行为和输出。
2.2 常用选项
在使用CFR(Class File Reader)反编译器时,一些选项比其他选项更为常用,因为它们提供了对反编译过程中最基本和最直接的控制。以下是一些最常用的CFR选项:
-
--outputdir <directory>:指定输出目录,反编译的代码将被保存到这个目录下。这是在处理多个类文件或整个jar文件时非常有用的选项。 -
--outputpath <file>:指定输出文件的路径,反编译的代码将被保存到这个文件中。当你只关心一个类或少数几个类的反编译结果时,这个选项很有用。 -
--decodelambdas:尝试反编译Lambda表达式。由于Lambda表达式是Java 8及更高版本中的一个重要特性,这个选项通常被启用以获得更准确的反编译结果。 -
--showversion:显示CFR的版本信息。这对于确保你正在使用的是最新版本的CFR或者对版本有特定要求时很有帮助。 -
--silent:减少CFR在反编译过程中的输出信息。当你不需要详细的进度信息时,这个选项可以让输出更加简洁。 -
--comments:在生成的代码中包含注释。这可以帮助理解反编译的代码,尤其是当原始代码中包含了有用的注释时。 -
--renameillegalidents:重命名不合法的标识符。这对于处理混淆过的代码特别有用,因为混淆器可能会生成不符合Java标识符命名规则的名称。 -
--stringbuilder:使用StringBuilder而不是StringBuffer。这反映了较新Java版本的实践,因为StringBuilder通常比StringBuffer更优。 -
--tryresources:尝试反编译try-with-resources语句。这是Java 7引入的一个重要特性,能够自动管理资源。 -
--help:显示帮助信息,包括所有可用的命令行选项及其描述。这是了解和探索CFR功能的起点。
这些选项中的许多都是为了提高反编译的准确性、可读性或者操作的便利性。根据你的具体需求,你可能会发现其中一些选项特别有用。
三、举例
3.1 查看 lambda 底层实现机制
1.lambda 表达式的本质:函数式接口的匿名子类的匿名对象
2.lambda表达式是语法糖
语法糖:编码时是lambda简洁的表达式,在字节码期,语法糖会被转换为实际复杂的实现方式,含义不变;即编码表面有个糖衣,在编译期会被脱掉
3.1.1 反编译 lambda
当使用--decodelambdas false选项运行CFR反编译器时,CFR将不会尝试以Lambda表达式的形式反编译Java 8及以上版本中的Lambda表达式。相反,它会以匿名类或类似的结构来展示这些Lambda表达式。这可能会使得反编译的代码看起来与原始源代码有较大差异,特别是在使用Lambda表达式的地方。
原始Java代码
假设我们有以下简单的Java程序,它使用Lambda表达式来遍历并打印一个字符串列表:
import java.util.Arrays;
import java.util.List;public class LambdaExample {public static void main(String[] args) {List<String> items = Arrays.asList("Apple", "Banana", "Cherry");items.forEach(item -> System.out.println(item));}
}
编译Java代码
首先,我们需要编译这个Java程序。在命令行中,使用javac命令编译这个程序:
javac LambdaExample.java
这将生成LambdaExample.class文件。
使用CFR反编译并应用--decodelambdas false
现在,我们将使用CFR反编译器来反编译这个.class文件,并使用--decodelambdas false选项来禁止Lambda表达式的特殊处理。在命令行中,运行以下命令:
java -jar cfr-0.152.jar LambdaExample.class --decodelambdas false
请确保将cfr-0.152.jar替换为你的CFR .jar文件的实际路径。
反编译结果
由于--decodelambdas false选项的使用,CFR将不会以Lambda表达式的形式展示原始的Lambda表达式。相反,它可能会生成一个匿名类或类似的结构来表示Lambda表达式的功能。反编译的输出可能看起来像这样:
/** Decompiled with CFR 0.152.*/
import java.lang.invoke.LambdaMetafactory;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;public class LambdaExample {public static void main(String[] stringArray) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry");list.forEach((Consumer<String>)LambdaMetafactory.metafactory(null, null, null, (Ljava/lang/Object;)V, lambda$main$0(java.lang.String ), (Ljava/lang/String;)V)());}private static /* synthetic */ void lambda$main$0(String string) {System.out.println(string);}
}
3.1.2 反编译结果解释
这段代码是一个使用CFR反编译器反编译后的Java程序,其中包含了Lambda表达式的使用。原始的Java代码可能使用了Lambda表达式来遍历一个字符串列表并打印每个元素。下面是对这段反编译代码的解释:
导入部分
import java.lang.invoke.LambdaMetafactory;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
这部分代码导入了程序中使用到的类。LambdaMetafactory是Java在运行时动态生成和调用Lambda表达式的关键工具。Arrays、List和Consumer则是在集合操作中常用的类和接口。
类定义
public class LambdaExample {...
}
定义了一个名为LambdaExample的公共类。
主方法
public static void main(String[] stringArray) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry");list.forEach((Consumer<String>)LambdaMetafactory.metafactory(null,null, null,(Ljava/lang/Object;)V, lambda$main$0(java.lang.String ), (Ljava/lang/String;)V)());
}
这是程序的主方法,它创建了一个包含三个字符串的列表,并使用forEach方法遍历这个列表。在原始的Java代码中,这里很可能使用了一个Lambda表达式来打印列表中的每个元素。在反编译的代码中,Lambda表达式被转换成了对LambdaMetafactory.metafactory方法的调用,这个方法在运行时动态生成了一个实现了Consumer接口的类的实例。这个实例的行为等同于原始的Lambda表达式。
Lambda表达式的静态方法
private static /* synthetic */ void lambda$main$0(String string) {System.out.println(string);
}
这个静态方法是原始Lambda表达式的体现。在编译时,Java编译器将Lambda表达式转换为类中的一个私有静态方法。这里,lambda$main$0方法接收一个字符串参数,并打印它。这个方法是由LambdaMetafactory动态生成的Consumer实例在forEach方法中被调用的。
总结
这段反编译的代码展示了Java中Lambda表达式的底层实现机制。原始的Lambda表达式被转换为一个私有静态方法,而LambdaMetafactory用于在运行时动态生成一个符合Lambda表达式行为的Consumer实例。这种机制使得Java能够在保持类型安全的同时,提供对Lambda表达式的高效支持。
相关文章:
CFR( Java 反编译器)
一、安装教程 CFR(Class File Reader)是一个流行的Java反编译器,它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程: 下载CFR 访问CFR的官方网站或GitHub仓库:CFR的最新版本和所…...
单片机的两种看门狗原理解析——IWDG和WWDG
一、IWDG独立开门狗的主要性能 计时机制: 递减计数器 独立开门狗的初始频率: LSI低速内部时钟:RC震荡器,40kHz 独立开门狗是以LSI为初始频率的,所以独立开门狗的初始时钟频率取决与单片机本身,因此在使…...
SQL进阶技巧:如何获取状态一致的分组? | 最大、最小值法
目录 0 需求描述 1 数据准备 2 问题分析 方法1:最大、最小值法(技巧) 方法2:常规思路 3 小结 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下: 数字化建设通…...
windows10使用bat脚本安装前后端环境之msyql5.7安装配置并重置用户密码
首先需要搞清楚msyql在本地是怎么安装配置、然后在根据如下步骤编写bat脚本: 思路 1.下载mysql5.7 zip格式安装包 2.新增data文件夹与my.ini配置文件 3.初始化数据库 4.安装mysql windows服务 5.启动并修改root密码(新增用户初始化授予权限)…...
文件上传、amrkdown编辑器
一、文件上传 这里我以图片为例,进行上传,上传到阿里云oss(对象存在中) 首先,我们先梳理一下,图片上传的流程 1、前端选择文件,提交文件 前端提交文件,我们可以使用ElementUI中的…...
Linux防火墙-4表5链
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...
(最新已验证)stm32 + 新版 onenet +dht11+esp8266/01s + mqtt物联网上报温湿度和控制单片机(保姆级教程)
物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意:ESP-01sWIFI模块,去搜了一下这个小东西很有玩点,远程控制LED啥的,然后我就想…...
无环SLAM系统集成后端回环检测模块(loop):SC-A-LOAM以及FAST_LIO_SLAM
最近在研究SLAM目标检测相关知识,看到一篇论文,集成了SC-A-LOAM作为后端回环检测模块,在学习了论文相关内容后决定看一下代码知识,随后将其移植,学习过程中发现我找的论文已经集成了回环检测模块,但是我的另…...
速盾:视频开cdn合适还是视频点播合适?
在选择视频服务时,许多企业和个人面临了一个重要的决策,那就是选择是使用开CDN(内容分发网络)还是使用视频点播服务。这两种选择都有各自的优势和适用场景,因此在做出决定之前,我们需要仔细评估自身的需求和…...
Mac电脑安装FFmpeg和卸载FFmpeg
Mac电脑安装FFmpeg 在Mac上安装FFmpeg有几种方法,以下是通过Homebrew安装的最简单方法: 1. 使用Homebrew安装FFmpeg 如果你已经安装了Homebrew,可以通过以下命令来安装FFmpeg: 打开终端 (Terminal)。更新Homebrew:…...
数据结构:栈 及其应用
逻辑结构: 栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合 (受限的线性表)。这种数据结构只允许在栈顶进行添加(push)或删除(pop&…...
批量发送邮件:性能优化与错误处理深度解析
目录 一、批量发送邮件的基础概述 1.1 批量发送邮件的定义 1.2 邮件发送流程 二、性能优化策略 2.1 发送速率控制 2.2 队列管理 2.3 动态IP池管理 2.4 智能调度 三、错误处理机制 3.1 暂时性发送错误处理 3.2 永久性发送错误处理 3.3 邮件反馈收集与分析 四、案例…...
STM32原理知识查询表
本篇文章主要收录单片机学习过程中的各种知识点原理,如果后面遇到了比较具体的应用,也会有专门的配套实践过程。 2024.09.27单片机的两种看门狗原理解析 持续待更新。。。。。...
从 Kafka 到 WarpStream: 用 MinIO 简化数据流
虽然 Apache Kafka 长期以来一直是流数据的行业标准,但新的创新替代方案正在重塑生态系统。其中之一是 WarpStream,它最近在 Confluent 的所有权下进入了新的篇章。此次收购进一步增强了 WarpStream 提供高性能、云原生数据流的能力,巩固了其…...
【Gitee自动化测试4】本地Git分支的增删查,本地Git分支中文件的增删查,本地文件的暂存/提交,本地分支的推送
一、流程 本地创建分支,设定连接什么云分支本地创建文件,暂存、提交–>本地分支本地分支推送所有修改–>云仓库 二、分支概念 在版本回退里,每次提交,git都把它们串成一条时间线,这条时间线可以理解为是一个分…...
vue-baidu-map的基本使用
前言 公司项目需求引入百度地图,由于给的时间比较短,所以就用了已经封装好了的vue-baidu-map 一、vue-baidu-map是什么? vue-baidu-map是基于vue.js封装的百度地图组件(官方文档) 二、使用步骤 1.下载插件 //我下载的版本 npm install …...
策略路由控制选路
🐣个人主页 可惜已不在 🐤这篇在这个专栏 华为_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 一、 实验拓扑 二、 实验简述 三、 实验配置 配置路由信息 配置控制选路 四、 实验验证 一、 实验…...
【数据结构和算法实践-排序-快速排序】
数据结构和算法实践-排序-归并排序 题目My Thought代码示例JAVA-8 题目 排序 My Thought 然后再进行递归,递归要注意两个方面: 一、自我调用 二、终止条件:即函数边界 注意点:树、递归* 代码示例 JAVA-8 public class QuickSo…...
测试面试题:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试
单元测试:完成最小的软件设计单元(模块)的验证工作,目标是确保模块被正确的编码集成测试:通过测试发现与模块接口有关的问题系统测试:是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合…...
回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出
回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出 文章目录 一、清单二、实验结果三、核心代码四、代码获取五、总结 一、清单 基于灰狼优化BP神经网络的数据预测Matlab程序GWO–BP 基于灰狼优化卷积神经网络的数据预测Matlab程序G…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
