java反编译篇--miaow.Y.Hu

2023-11-05

好了,好久没更新了,今天来一篇关于java反编译的篇举例子。

Java编译文件是指通过Java编译器将Java源代码文件(.java文件)编译成字节码文件(.class文件)的过程。在Java中,源代码文件包含人类可读的文本,而字节码文件是计算机可以理解的二进制指令集。

Java编译器的主要任务是将源代码文件中的语法、类型检查和语义分析转换为字节码文件。这个过程包括两个主要阶段:

编译和链接。

  • 编译阶段:编译器首先对源代码进行语法分析和类型检查,然后将代码转换为抽象语法树(AST)。接下来,编译器会优化AST,并将其转换为中间表示(IR)。最后,编译器将IR转换为字节码文件。

  • 链接阶段:链接器负责将生成的类文件和相关的库文件合并成一个可执行的Java程序。链接器需要确保所有引用的类和方法都存在,并按照正确的顺序进行加载。

Java编译器的输出是一个或多个字节码文件,通常以.class扩展名结尾。这些字节码文件可以在Java虚拟机(JVM)上运行,或者使用Java开发工具(如Eclipse、IntelliJ IDEA等)进行调试和分析。

需要注意的是,Java源代码文件本身不能直接被Java编译器编译。用户需要先使用文本编辑器或其他开发工具编写源代码,然后将其保存为.java文件。接下来,用户可以通过命令行或集成开发环境(IDE)调用Java编译器(如javac命令)来编译源代码文件。

创建一个最简单的例子:

public class Demo01{
	public static void main(String[] args){
		String name = "LXH";
		System.out.println(name);
	}
}

在cmd控制台,我们进行反编译这个.java文件。

# 进入这个类所在的文件夹
javac -version # 检查一下javac -version 是否配置好了环境变量
javac Demo01.java # 将我们编写的类文件转换为二进制文件
java Demo01 # Java虚拟机执行二进制文件
# 接下来,重头戏,反编译
javap -verbose Demo01

得到反编译后的代码

Classfile /D:/工作中的学习资料/Git Down/java_play/CMD_PLAY/DEMO1/Demo01.class 
  Last modified 2023-8-28; size 415 bytes
  MD5 checksum 1e5cfb3099439767a8a3f40ebccce0b7
  Compiled from "Demo01.java"
public class Demo01
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = String             #16            // LXH
   #3 = Fieldref           #17.#18        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // Demo01
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               Demo01.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Utf8               LXH
  #17 = Class              #23            // java/lang/System
  #18 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               Demo01
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public Demo01();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #2                  // String LXH
         2: astore_1
         3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         6: aload_1
         7: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        10: return
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 10
}
SourceFile: "Demo01.java"

我们根据上述的代码进行分析:
Classfile /D:/工作中的学习资料/Git Down/java_play/CMD_PLAY/DEMO1/Demo01.class,代表这个类当前所在的文件夹具体位置。

Last modified 2023-8-28; size 415 bytes 表示上次修改日期,另外这个生成的文件的大小,415个字节。
重点,我们看常量池:Constant pool 存储了编译后的字节码指令和相关信息。

  • #1: 表示对java/lang/Object类的""方法的引用。
  • #2: 表示字符串常量"LXH"。
  • #3: 表示对System.out字段的引用,它是java.io.PrintStream类的静态成员变量。
  • #4: 表示对java.io.PrintStream.println方法的引用,它是java.io.PrintStream类的实例方法。
  • #5: 表示Demo01类本身。
  • #6: 表示java/lang/Object类本身。
  • #7: 表示构造函数的签名,即无参数的构造函数。
  • #8: 表示无参数构造函数的方法类型。
  • #9: 表示行号表条目,用于在调试时定位源代码行。
  • #10: 表示主方法的签名,即接受一个String数组参数的方法。
  • #11: 表示主方法所在的源文件名。
  • #12: 表示主方法的参数类型,即String数组。
  • #13: 表示行号表中的主方法行号。
  • #14: 表示主方法所在的源文件名。
  • #15: 表示主方法的参数类型,即String数组。
  • #16: 表示字符串常量"LXH"。
  • #17: 表示java/lang/System类。
  • #18: 表示System.out字段的名称和类型。
  • #19: 表示java/io/PrintStream类。
  • #20: 表示java.io.PrintStream.println方法的名称和类型。
  • #21: 表示Demo01类本身。
  • #22: 表示java/lang/Object类本身。
  • #23: 表示java/lang/System类。
  • #24: 表示System.out字段的名称和类型。
  • #25: 表示java.io.PrintStream类中的out字段名称。
  • #26: 表示java.io.PrintStream类。
  • #27: 表示java.io.PrintStream.println方法的名称和类型。

分析:

#1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
这是一个方法引用(Methodref),它引用了常量池中的第6个项(#6),该项是一个类引用,指向 java/lang/Object。
#15 表示常量池中的第15个项,是一个名称和类型(NameAndType)引用,它指向构造函数的名字和描述符(<init>:()V)。
这个引用表示调用 java/lang/Object 类的无参数构造函数。

#2 = String             #16            // LXH
这是一个字符串常量(String),它引用了常量池中的第16个项(#16),表示字符串 "LXH"。

#3 = Fieldref           #17.#18        // java/lang/System.out:Ljava/io/PrintStream;
这是一个字段引用(Fieldref),它引用了常量池中的第17个项(#17),该项是一个类引用,指向 java/lang/System。#18 表示常量池中的第18个项,是一个名称和类型引用,它指向 out 字段的名字和描述符(Ljava/io/PrintStream;)。
这个引用表示访问 java/lang/System 类中的 out 字段,该字段的类型是 java/io/PrintStream。

#4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
这是一个方法引用,它引用了常量池中的第19个项(#19),该项是一个类引用,指向 java/io/PrintStream。#20 表示常量池中的第20个项,是一个名称和类型引用,它指向 println 方法的名字和描述符((Ljava/lang/String;)V)。这个引用表示调用 java/io/PrintStream 类的 println 方法,该方法接受一个 java/lang/String 类型的参数,返回类型是 void。

#5 = Class              #21            // Demo01
这是一个类引用,它引用了常量池中的第21个项(#21),表示类 Demo01。

#6 = Class              #22            // java/lang/Object
这是一个类引用,它引用了常量池中的第22个项(#22),表示类 java/lang/Object。

#7 = Utf8               <init>
这是一个UTF-8编码的字符串,表示字符串 "<init>",通常用于表示构造函数。

#8 = Utf8               ()V
这是一个UTF-8编码的字符串,表示方法的描述符,( )V 表示该方法没有参数且返回类型是 void。

#9 = Utf8               Code
这是一个UTF-8编码的字符串,表示"Code",通常用于标识字节码中的代码部分。

#10 = Utf8              LineNumberTable
这是一个UTF-8编码的字符串,表示"LineNumberTable",通常用于存储字节码指令与源代码行号之间的映射关系。

#11 = Utf8              main
这是一个UTF-8编码的字符串,表示方法名"main"#12 = Utf8              ([Ljava/lang/String;)V
这是一个UTF-8编码的字符串,表示方法的描述符,([Ljava/lang/String;)V 表示方法接受一个 java/lang/String 类型的数组作为参数,返回类型是 void。

#13 = Utf8              SourceFile
这是一个UTF-8编码的字符串,表示"SourceFile",通常用于指定源代码文件的名称。

#14 = Utf8              Demo01.java
这是一个UTF-8编码的字符串,表示源代码文件的名称为"Demo01.java"#15 = NameAndType       #7:#8          // "<init>":()V
这是一个名称和类型引用,它引用了常量池中的第7个项(#7),表示构造函数的名字。#8 表示常量池中的第8个项,是一个方法描述符,()V 表示该方法没有参数且返回类型是 void。这个引用表示构造函数的名字和描述符。

#16 = Utf8              LXH
这是一个UTF-8编码的字符串,表示字符串"LXH"#17 = Class             #23            // java/lang/System
这是一个类引用,引用了常量池中的第23个项,表示类java/lang/System。

#18 = NameAndType       #24:#25        // out:Ljava/io/PrintStream;
这是一个名称和类型引用,它引用了常量池中的第24个项(#24),表示字段名"out"。#25 表示常量池中的第25个项,是一个字段的类型描述符,Ljava/io/PrintStream; 表示字段的类型是java/io/PrintStream。这个引用表示字段名和类型描述符。

#19 = Class             #26            // java/io/PrintStream
这是一个类引用,引用了常量池中的第26个项,表示类java/io/PrintStream。

#20 = NameAndType       #27:#28        // println:(Ljava/lang/String;)V
这是一个名称和类型引用,它引用了常量池中的第27个项(#27),表示方法名"println"。#28 表示常量池中的第28个项,是一个方法描述符,(Ljava/lang/String;)V 表示方法接受一个java/lang/String类型的参数,返回类型是 void。这个引用表示方法名和方法描述符。

#21 = Utf8              Demo01
这是一个UTF-8编码的字符串,表示类名"Demo01"#22 = Utf8              java/lang/Object
这是一个UTF-8编码的字符串,表示类名"java/lang/Object"#23 = Utf8              java/lang/System
这是一个UTF-8编码的字符串,表示类名"java/lang/System"#24 = Utf8              out
这是一个UTF-8编码的字符串,表示字段名"out"#25 = Utf8              Ljava/io/PrintStream;
这是一个UTF-8编码的字符串,表示字段类型描述符Ljava/io/PrintStream;,表示类型是java/io/PrintStream。

#26 = Utf8              java/io/PrintStream
这是一个UTF-8编码的字符串,表示类名"java/io/PrintStream"#27 = Utf8              println
这是一个UTF-8编码的字符串,表示方法名"println"#28 = Utf8              (Ljava/lang/String;)V
这是一个UTF-8编码的字符串,表示方法的描述符,(Ljava/lang/String;)V 表示方法接受一个java/lang/String类型的参数,返回类型是 void。

类定义部分:

  • 类名:Demo01
  • 访问标志:ACC_PUBLIC,表示类是公共的,可以从其他类访问。
  • 超类:java/lang/Object,该类继承自 java.lang.Object。
  • 常量池(Constant Pool): 常量池包含了一系列的常量项,例如方法引用、字段引用、字符串字面值等。

构造函数(Constructor):

  • 公共构造函数:public Demo01(),无参数,无返回值。
  • 构造函数访问标志:ACC_PUBLIC,表示构造函数是公共的。

构造函数的字节码指令(Code)部分:

  • 栈大小(stack):1,表示最大堆栈深度为1。
  • 本地变量表大小(locals):1,表示本地变量表中有1个元素。
  • 参数大小(args_size):1,表示方法的参数个数为1。

构造函数内容:

  • 指令1:aload_0,将当前对象引用(this)加载到操作数栈。
  • 指令2:invokespecial #1,调用父类 Object 的构造函数(“”),完成对象的初始化。
  • 指令4:return,从构造函数返回。
  • 构造函数的行号表(LineNumberTable):展示了字节码指令和源代码行号的映射。在这里只有一行,行号为3。

主方法(main):

  • 公共静态主方法:public static void main(String[] args)。
  • 方法访问标志:ACC_PUBLIC、ACC_STATIC,表示方法是公共的和静态的。

主方法的字节码指令部分:

  • 指令0:将字符串 “LXH” 加载到操作数栈。
  • 指令2:将操作数栈的值存储到局部变量表索引为1的位置(astore_1)。
  • 指令3:获取静态字段 System.out。
  • 指令6:加载局部变量1(存储的是 “LXH” 字符串)到操作数栈。
  • 指令7:调用 System.out 的 println 方法,将字符串打印到控制台。
  • 指令10:返回主方法。

主方法的行号表部分:

  • 源代码行号5对应指令0。
  • 源代码行号6对应指令2。
  • 源代码行号7对应指令10。
  • 源文件名(SourceFile):表示源文件名为 “Demo01.java”。

实际上,我在拿到这段编译后的代码也是吓了一跳,我没想到写的就4行代码,结果反编译出来就这么长,但是认真去看了一下,还是很长,但是认真去分析,发现还是有规律可循的,认真看,还是有收货的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java反编译篇--miaow.Y.Hu 的相关文章

  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • 浅拷贝&深拷贝

    什么是深 浅拷贝 他们跟赋值有什么关系 浅拷贝 浅拷贝是创建一个新对象 这个对象有着原始对象属性值的一份精确拷贝 如果属性是基本类型 拷贝的就是基本类型的值 如果属性是引用类型 拷贝的就是内存地址 所以如果其中一个对象改变了这个地址 就会影
  • 算法 堆排序 heapSort

    堆排序 heapSort 堆是一种数据结构 一种叫做完全二叉树的数据结构 堆排序是利用堆数据结构而设计的一种排序算法 堆排序是一种选择排序 其最坏 最好 平均时间复杂度均为O nlogn 同时也是不稳定排序 堆的性质 这里我们用到两种堆 其
  • Error 12154 received logging on to the standby

    环境为 操作系统 AIX 6 1 oracle版本 11 2 0 3 psu5 本编记录了本人一次DG搭建失败的经历 只是一个小的错误 但却导致我排查了半天 记录本次经历用来警醒自己 作为一名dba任何时候我们都要万分仔细 认真 DG搭建的
  • Codeforces 102263C-Check The Text【模拟】 难度:*

    题意 Roze has a special keyboard which consists only of 29 keys 26 alphabetic a z keys which prints the 26 lowercase Latin
  • buck电路_基本斩波电路---BUCK电路

    BUCK电路又称降压斩波电路 其工作原理图如图1所示 该电路有输入直流电源Vin 一个全控器件M1 续流二极管D1 电感L1 负载R1 其主要用于电路的供电电源及带蓄电池负载 拖动直流电机等 在拖动直流电机及蓄电池负载时会出现反电动势 如图
  • 简易版 图书管理系统

    目录 1 Book包 1 1 Book类 1 2 BookList类 2 User包 2 1 User抽象类 2 2 AdminUser类 2 3 NormalUser类 3 Operate包 3 1 MyOperate接口 3 2 Add
  • 【操作系统】

    请解释下局部性原理 通俗易懂的解释 二维数组两维不同遍历的实例 关于CPU三级缓存的介绍 b
  • bes2300 tws配对_tws 耳机春天来了!

    本人负责蓝牙耳机音箱厂家的市场拓展 经常接触国内外各种卖家 专注亚马逊 京东的精品卖家 也有日本 欧美等线下渠道等的B端客户 当然作为行业的业务 也经常接触同行工厂 购买同行的产品或者借用产品用来测试 所以对产品的发展技术趋势及产品的体验感
  • 一文详解Spring事务传播机制

    目录 背景 Spring事务 Transactional注解 使用场景 失效场景 原理 常用参数 注意 事务传播机制 处理嵌套事务流程 主事务为REQUIRED子事务为REQUIRED 主事务为REQUIRED子事务为REQUIRES NE
  • Android JNI 打印日志

    首先要保证Cmake文件中有log模块引用 不然编译不通过 编译一个库 add library native lib 库的名字 SHARED 动态库 so库 native lib cpp 需要编译的C 文件 相当于定义一个变量log lib
  • 内核模式驱动程序的网络结构

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 1 Windows 2000 网络结构和OSI模型 Windows 2000网络结构是以国际标准化组织 ISO 制定的七层网络模型为基础的
  • 刷脸支付助力商家吸引客户增加客流量

    顾客支付完成后 直接领取会员卡 保存到微信卡包 可以作为充值卡 积分卡 打折卡 商家可以进行自定义 使用方便 不易丢失 灵活度高 同时商家还可以设置一键分享会员卡 通过老顾客转介绍有礼 快速增加会员 商家可自行发送优惠劵 通过刷脸支付即可领
  • ubuntu添加vlan和路由追踪

    1 linux添加vlan子接口 安装vconfig命令 apt get install vlan vconfig add eth0 105 eth0为物理网络接口名称 ifconfig eth0 105 192 168 105 10 对上
  • HTML 5 Canvas vs. SVG

    一 SVG SVG 是一种使用 XML 描述 2D 图形的语言 SVG 基于 XML 这意味着 SVG DOM 中的每个元素都是可用的 您可以为某个元素附加 JavaScript 事件处理器 在 SVG 中 每个被绘制的图形均被视为对象 如
  • 面试题 02.03. 删除中间节点

    面试题 02 03 删除中间节点 删除中间节点 这道题是说只能访问中间某个位置的节点 然后要把它删除 由于没给前驱指针 如果真的删了中间的节点 链表就断开了 所以考虑把下一个节点的值赋给当前节点 然后删除下一个节点 这样就相当于删除了中间节
  • 幸福感

    抱怨 坦荡的看自己 做自己 我有什么 我要什么 我愿意放弃什么 公平 我们过这一生是为什么呢 世界什么时公平与不公平呢 人最宝贵的 客观的 生命和时间 心态 幸福感来自于心态 一个乐观的心态 每天都会发生很多事情让自己很浮躁 有时会觉得身心
  • [1042]JWT加密

    文章目录 简介 起源 数据格式 JWT交互流程 python使用jwt 非对称加密 简介 JWT 全称是Json Web Token 是JSON风格轻量级的授权和身份认证规范 可实现无状态 分布式的Web应用授权 jwt的解析工具 http
  • 有人物联口红DTU DR154配置与RS 485传感器数据处理

    一 硬件设备 1 有人物联口红DTU DR154 RS 485版本 配置的话通过小程序 联博士 蓝牙配置 手机扫描DTU背后的二维码即可 蓝牙密码也在背面 省去了连接电脑硬件配置的繁琐步骤 2 温度传感器 速灵科RSDS5 RS485接口
  • C语言位运算符及作用:与、或、异或、取反、左移和右移

    一 按位与 如果两个相应的二进制位都为1 则该位的结果值为1 否则为0 应用 1 清零 若想对一个存储单元清零 即使其全部二进制位为0 只要找一个二进制数 其中各个位符合一下条件 原来的数中为1的位 新数中相应位为0 然后使二者进行 运算
  • java反编译篇--miaow.Y.Hu

    好了 好久没更新了 今天来一篇关于java反编译的篇举例子 Java编译文件是指通过Java编译器将Java源代码文件 java文件 编译成字节码文件 class文件 的过程 在Java中 源代码文件包含人类可读的文本 而字节码文件是计算机