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

CFR( Java 反编译器)---> lambda 表达式底层实现机制

一、安装教程

CFR(Class File Reader)是一个流行的Java反编译器,它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程:

下载CFR

  1. 访问CFR的官方网站或GitHub仓库:CFR的最新版本和所有历史版本都可以在其GitHub仓库中找到。访问 CFR的GitHub页面。

  2. 选择版本并下载:在GitHub仓库中,点击“Releases”部分,找到你想要下载的版本。通常,你应该下载最新的稳定版本。点击对应版本旁边的.jar文件链接进行下载。

使用CFR反编译.class文件

一旦你下载了CFR的.jar文件,你就可以使用Java命令行工具来运行它并反编译.class文件或.jar文件。确保你的计算机上已经安装了Java。

  1. 打开命令行工具:在Windows上,你可以使用CMD或PowerShell;在macOS或Linux上,使用Terminal。

  2. 使用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文件的路径。

  3. 使用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选项:

  1. --outputdir <directory>:指定输出目录,反编译的代码将被保存到这个目录下。这是在处理多个类文件或整个jar文件时非常有用的选项。

  2. --outputpath <file>:指定输出文件的路径,反编译的代码将被保存到这个文件中。当你只关心一个类或少数几个类的反编译结果时,这个选项很有用。

  3. --decodelambdas:尝试反编译Lambda表达式。由于Lambda表达式是Java 8及更高版本中的一个重要特性,这个选项通常被启用以获得更准确的反编译结果。

  4. --showversion:显示CFR的版本信息。这对于确保你正在使用的是最新版本的CFR或者对版本有特定要求时很有帮助。

  5. --silent:减少CFR在反编译过程中的输出信息。当你不需要详细的进度信息时,这个选项可以让输出更加简洁。

  6. --comments:在生成的代码中包含注释。这可以帮助理解反编译的代码,尤其是当原始代码中包含了有用的注释时。

  7. --renameillegalidents:重命名不合法的标识符。这对于处理混淆过的代码特别有用,因为混淆器可能会生成不符合Java标识符命名规则的名称。

  8. --stringbuilder:使用StringBuilder而不是StringBuffer。这反映了较新Java版本的实践,因为StringBuilder通常比StringBuffer更优。

  9. --tryresources:尝试反编译try-with-resources语句。这是Java 7引入的一个重要特性,能够自动管理资源。

  10. --help:显示帮助信息,包括所有可用的命令行选项及其描述。这是了解和探索CFR功能的起点。

这些选项中的许多都是为了提高反编译的准确性、可读性或者操作的便利性。根据你的具体需求,你可能会发现其中一些选项特别有用。

三、举例

3.1 查看 lambda 底层实现机制

1.lambda 表达式的本质:函数式接口的匿名子类的匿名对象
2.lambda表达式是语法糖

语法糖:编码时是lambda简洁的表达式,在字节码期,语法糖会被转换为实际复杂的实现方式,含义不变;即编码表面有个糖衣,在编译期会被脱掉

在 Java 中,当你使用 lambda 表达式时,编译器在背后做了很多工作来将这些表达式转换成可执行的代码。特别是,它使用了 invokedynamic 指令和 LambdaMetafactory 来动态生成和加载 lambda 表达式对应的类。这是 Java 8 引入的一种新机制,用于提高 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));}
}

当这段代码被编译时,对于 items.forEach(item -> System.out.println(item)); 这一行,编译器生成的字节码会使用 invokedynamic 指令来引导 lambda 表达式的实现。这个过程涉及到 LambdaMetafactory,它是 JDK 提供的一个工厂类,专门用于生成符合特定函数式接口的类实例。

LambdaMetafactory.metafactory 是一个静态方法,它接受一系列参数,包括目标接口的方法类型、lambda 表达式的实现方法的方法句柄(Method Handle),以及 lambda 表达式的签名。它返回一个 CallSite 对象,这个对象封装了对动态生成的 lambda 表达式类的实例的调用。

在运行时,invokedynamic 指令首次执行时会调用这个 metafactory 方法,生成一个实现了 Consumer<String> 接口的类的实例。这个实例具体执行的代码就是 lambda 表达式的体。

编译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表达式的关键工具。ArraysListConsumer则是在集合操作中常用的类和接口。

类定义
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接口的类的实例。因为forEach方法入参就是一个函数式接口Consumer<? super T>,即:最终返回Consumer实例对象

default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}} 
Lambda表达式的静态方法
private static /* synthetic */ void lambda$main$0(String string) {System.out.println(string);
}

这个静态方法是原始Lambda表达式的体现。在编译时,Java编译器将Lambda表达式转换为类中的一个私有静态方法。这里,lambda$main$0方法接收一个字符串参数,并打印它。

总结

这段反编译的代码展示了Java中Lambda表达式的底层实现机制。原始的Lambda表达式被转换为一个私有静态方法,而LambdaMetafactory用于在运行时动态生成一个符合Lambda表达式行为的Consumer实例。这种机制使得Java能够在保持类型安全的同时,提供对Lambda表达式的高效支持。

相关文章:

CFR( Java 反编译器)---> lambda 表达式底层实现机制

一、安装教程 CFR&#xff08;Class File Reader&#xff09;是一个流行的Java反编译器&#xff0c;它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程&#xff1a; 下载CFR 访问CFR的官方网站或GitHub仓库&#xff1a;CFR的最新版本和所…...

《C++多态性:开启实际项目高效编程之门》

在 C的广阔编程世界中&#xff0c;多态性是一个强大而富有魅力的特性。它为程序员提供了极大的灵活性和可扩展性&#xff0c;使得代码能够更加优雅地应对复杂的业务需求。在实际项目中&#xff0c;理解和正确应用 C的多态性至关重要&#xff0c;它可以显著提高代码的质量、可维…...

UDS_5_输入输出控制功能单元

目录 一. 0x2F服务 一. 0x2F服务 InputOutputControlByIdentifier(0x2F)服务 用于替换服务器输入信号的值或内部功能控制电子系统的某个输出(执行器) •请求报文 A_Data Byte Parameter Name Cvt Byte Value #1 InputOutputControlByIdentifier Request SID M 0x2F dataI…...

CAD快捷键

CAD快捷键 功能快捷键描述直线L点PO多段线PL多用于描边构造线XL无限长直线射线RAY样条曲线SPL绘制光滑曲线–––圆弧A圆C矩形REC正多边形POL–––填充H圆角F倒角CHA–––打断BR分解X合并J–––创建块B插入块I 功能快捷键描述移动M复制CO擦除E修剪TR延伸EX拉伸S镜像MI偏移…...

Spring6梳理12——依赖注入之注入Map集合类型属性

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 12 依赖注入之注入Map集合类型属性 12.1 创建Student类和Teacher类 Student类中创建了run…...

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义&#xff0c;在国内外的研究现状和发展趋势&#xff0c;尚待研究的问题 作用&#xff1a;本课题的目的是使失物招领信息管理清晰化&#xff0c;透明化&#xff0c;便于操作&#xff0c;易于管理。通过功能模…...

推荐4款2024年热门的PDF转ppt工具

有时候&#xff0c;我们为了方便&#xff0c;需要将PDF里面的内容直接转换的PPT的格式&#xff0c;既方便自己演示和讲解&#xff0c;也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话&#xff0c;我可以为大家推荐几个比窘方便实用的PDF转换工具…...

[深度学习]卷积神经网络CNN

1 图像基础知识 import numpy as np import matplotlib.pyplot as plt # 图像数据 #imgnp.zeros((200,200,3)) imgnp.full((200,200,3),255) # 可视化 plt.imshow(img) plt.show() # 图像读取 imgplt.imread(img.jpg) plt.imshow(img) plt.show() 2 CNN概述 卷积层convrelu池…...

从零开始,Docker进阶之路(三):Docker镜像与命令

一、Docker核心名词 镜像文件、容器、仓库 镜像&#xff1a;简单理解为就是一个安装包&#xff0c;里面包含容器所需要运行的基础文件和配置信息&#xff0c;比如&#xff1a;redis镜像、mysql镜像等。 镜像的来源方式&#xff1a; 1.自己做镜像&#xff0c;比如自己开发微服…...

【计算机网络】网络层详解

文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…...

后端开发刷题 | 最小的K个数(优先队列)

描述 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&#xff0c;数组中每个数的大小0≤val≤1000 要…...

【JavaEE】——阻塞队列,生产消费者模型(较难)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;阻塞队列 1&#xff1a;概念 2&#xff1a;阻塞队列与普通队列比较 二&#xff1a;“生…...

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…...

STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器

目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…...

Go语言匿名字段使用与注意事项

1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段&#xff0c;称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式&#xff0c;所以也可以称作嵌套字段。 这种方式可以实现组合复用&#xff0c;即通过匿名字段&#xff0c;结构体…...

2024最新!!Java后端面试题(2)看这一篇就够了

hello uu们 感谢收看&#xff01;&#xff01;&#xff01;&#xff01;我最近听了一首歌《21》&#xff0c;真的很感慨&#xff0c;马上步入20的我也感觉时间真的飞快...望大家都能过上理想的生活&#xff0c;不负内心的所托...现在口语化更新答案&#xff0c;让大家更加模拟的…...

超好用的10款视频剪辑软件,从入门到精通

视频剪辑软件哪款比较好呢&#xff1f;无论是专业制作团队、自媒体创作者&#xff0c;还是家庭用户&#xff0c;一款好用的视频剪辑软件都能极大地提升创作效率和作品质量。以下是十款备受推崇的视频剪辑软件&#xff0c;分别从适用人群、易用程度和功能特点进行介绍。 1.影忆…...

python股票因子,交易所服务器宕机,量化交易程序怎么应对

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…...

使用nest+typeorm框架写数据库导致mysql的binlog暴增记录

这 两天用nesttypeorm写了一个商城&#xff0c;上线后mysql日志binlog两天就达到了10几个G&#xff0c;排查结果如下&#xff1a; 有个功能是定时遍历所有未签收的订单&#xff0c;看看是否到了自动签收时间&#xff0c;如果到了&#xff0c;就把订单状态设置成已签收。 代码…...

组合逻辑元件与时序逻辑元件

组合逻辑元件和时序逻辑元件都是数字电路中的基本构建块&#xff0c;但它们在功能和结构上存在显著差异。 1. 组合逻辑元件: 内容: 组合逻辑元件的输出仅取决于当前的输入&#xff0c;而与之前的输入无关。 它们没有记忆功能。 常见的组合逻辑元件包括&#xff1a; 与门 (AND…...

天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;天龙八部怀旧单机微改人面桃花。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xf…...

docker管理

拉取容器镜像 docker pull 镜像名:镜像版本查看镜像 docker images查看容器列表 # 查看正在运行的容器 docker ps # 查看全部的容器(包括停止的容器) docker ps -a进入容器 docker exec -it 容器id /bin/bash停止容器 docker stop 容器id运行容器 docker start 容器id删除…...

electron教程(三)窗口设置

在main.js文件中&#xff0c;创建窗口时会设置窗口的大小&#xff0c;其实还有很多其他属性&#xff0c;可以根据实际需求选择设置&#xff0c;但部分属性存在局限性&#xff0c;官网也有明确告知&#xff1a;自定义窗口 | Electron (electronjs.org) 项目文件目录如下&#x…...

图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)

1. 论文基本信息 论文标题&#xff1a;Deep Retinex Decomposition for Low-Light Enhancement 作者&#xff1a;Chen Wei等 发表时间和期刊&#xff1a;2018&#xff1b;BMVC 论文链接&#xff1a;https://arxiv.org/abs/1808.04560 2. 研究背景和动机 低光照条件下拍摄的…...

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU

1.配置时间2024/9/25 2.Anaconda-python版本3.7&#xff0c;yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…...

vue-i18n在使用$t时提示类型错误

1. 问题描述 Vue3项目中&#xff0c;使用vue-i18n&#xff0c;在模版中使用$t时&#xff0c;页面可以正常渲染&#xff0c;但是类型报错。 相关依赖版本如下&#xff1a; "dependencies": {"vue": "^3.4.29","vue-i18n": "^9.1…...

大厂面试真题-什么是CAS单点登录?什么原理

CAS&#xff08;Central Authentication Service&#xff0c;中央认证服务&#xff09;单点登录&#xff08;SSO&#xff0c;Single Sign-On&#xff09;的原理主要基于统一的认证机制和票据验证过程&#xff0c;使得用户只需在多个相互信任的应用系统中登录一次&#xff0c;即…...

用Java提取PDF表格到文本、CSV、Excel工作表

如何精准地提取PDF格式中嵌入的表格数据&#xff0c;并将其无缝转换为更加易于分析和操作的形式&#xff0c;如纯文本、CSV文件或Excel工作表&#xff0c;是一项重要的文档处理技巧。使用Java&#xff0c;我们可以简单地实现这一过程。本文将介绍如何利用Java从PDF文档提取表格…...

OpenCV视频I/O(10)视频采集类VideoCapture之从视频流中检索一帧图像函数 retrieve()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 解码并返回已抓取的视频帧。 cv::VideoCapture::retrieve() 是 VideoCapture 类的一个成员函数&#xff0c;用于从视频流中检索一帧图像。 retr…...

网站在线生成器/网络营销员岗位的职责与要求

刚刚开始想利用Timer去实现定时更新结果失败了。 之后使用了Handler去实现 View Code 1 package com.bw;2 3 import android.app.Activity;4 import android.os.Bundle;5 import android.os.Handler;6 import android.widget.TextView;7 8 public class TimeActivity extends …...

襄阳棋牌网站建设/腾讯广告推广怎么做

复习必备第一章(什么是操作系统&#xff1a;所谓操作系统就是能有效地管理计算机系统中的各种硬件\软件资源、合理的组织计算机的工作流程,从而为程序员\操作员和各类用户创造良好的工作环境的系统软件。操作系统基本特性&#xff1a;并发性(最主要特征)&#xff0c;共享性&…...

如何自做网站/新闻头条最新消息

TC130&#xff1a;看懂蒙特卡洛积分(一) 概率分布变换与随机采样​zhuanlan.zhihu.comTC130&#xff1a;游戏渲染进阶​zhuanlan.zhihu.com概率论背景(1) 数学期望设 是随机变量, 是 的函数, .A. 如果 是离散型随机变量, 其分布列为 .随机变量 的数学期望定义为 .的数学期望定义…...

佛山新网站建设公司/广州网络推广选择

原文连接&#xff1a;http://www.cnblogs.com/downmoon/archive/2012/04/19/2456451.html 在《SQL Server 2012服务端使用OFFSET/FETCH NEXT实现分页》一文中&#xff0c;我引用了《SQL Server 2012 - Server side paging demo using OFFSET/FETCH NEXT》&#xff0c;原文地址&…...

wordpress blod/百度网址大全简单版

执行 bgrewriteaof 命令 子线程就记录当前内存的数据作为命令内容保存到新的 aof 文件, 期间的写操作会记录到 aof buf, 当记录都保存到 aof 文件后, 再把 aof buff 命令写入. 最后, 替换掉旧的 aof 文件...

自驾游网站建设/短视频培训机构

最近因为环境原因&#xff0c;我们这些互联网从业者&#xff0c;算是比较动荡的&#xff0c;不论是反垄断、还是反教育资本化&#xff0c;都会波及一部分同行们要去折腾重新找工作。对于原本就被996、内卷等因素困扰的程序员们来说&#xff0c;并不是什么好事&#xff0c;尤其对…...