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

Java学习手册:Java反射与注解

Java反射与注解

Java反射(Reflection)和注解(Annotation)是Java语言中两个强大的特性,它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法,而注解则提供了一种元数据形式,用于为代码提供附加信息。本文将深入探讨Java反射和注解的核心概念、用法及实际应用场景。

Java反射

反射是Java提供的一种在运行时检查和操作类、对象、接口、字段和方法的能力。通过反射,可以在运行时获取类的信息并动态调用方法、访问字段等。反射的主要类位于java.lang.reflect包中。

获取类信息

反射的核心是通过Class对象获取类的信息。每个类都有一个Class对象,可以通过类名.class对象.getClass()Class.forName()获取。

示例代码

import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("java.lang.String");// 获取类名System.out.println("类名: " + clazz.getName());// 获取所有公共方法Method[] methods = clazz.getMethods();System.out.println("公共方法:");for (Method method : methods) {System.out.println(method.getName());}// 获取特定方法Method method = clazz.getMethod("length");System.out.println("方法: " + method.getName());} catch (ClassNotFoundException | NoSuchMethodException e) {e.printStackTrace();}}
}
动态调用方法

反射允许在运行时动态调用对象的方法。

示例代码

import java.lang.reflect.Method;public class InvokeMethodExample {public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("java.lang.String");// 创建对象Object obj = clazz.getDeclaredConstructor(new Class<?>[]{char[].class}).newInstance(new char[]{'H', 'e', 'l', 'l', 'o'});// 获取方法并调用Method method = clazz.getMethod("length");int length = (int) method.invoke(obj);System.out.println("字符串长度: " + length);} catch (Exception e) {e.printStackTrace();}}
}
访问私有字段和方法

反射可以突破访问限制,访问私有字段和方法。

示例代码

import java.lang.reflect.Field;
import java.lang.reflect.Method;public class AccessPrivateExample {private String privateField = "私有字段";private void privateMethod() {System.out.println("私有方法被调用");}public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("AccessPrivateExample");// 创建对象Object obj = clazz.getDeclaredConstructor().newInstance();// 访问私有字段Field field = clazz.getDeclaredField("privateField");field.setAccessible(true);System.out.println("私有字段值: " + field.get(obj));// 调用私有方法Method method = clazz.getDeclaredMethod("privateMethod");method.setAccessible(true);method.invoke(obj);} catch (Exception e) {e.printStackTrace();}}
}

Java注解

注解是Java 5引入的一种元数据形式,用于为代码提供附加信息。注解本身不会直接影响代码的行为,但可以通过反射机制在运行时读取和处理这些注解。

内置注解

Java提供了一些内置注解,用于常见的用途:

  • @Override:表示方法重写。
  • @Deprecated:表示方法或类已过时。
  • @SuppressWarnings:抑制编译器警告。

示例代码

public class DeprecatedExample {@Deprecatedpublic void oldMethod() {System.out.println("这个方法已过时");}public static void main(String[] args) {DeprecatedExample example = new DeprecatedExample();example.oldMethod(); // 编译器会发出警告}
}
自定义注解

开发者可以创建自定义注解,用于特定的业务逻辑。

示例代码

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {String value();
}// 使用注解
public class AnnotationExample {@MyAnnotation("Hello, Annotation!")public void annotatedMethod() {System.out.println("这是一个被注解的方法");}public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("AnnotationExample");// 获取方法Method method = clazz.getMethod("annotatedMethod");// 检查方法是否被注解if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("注解值: " + annotation.value());}// 调用方法Object obj = clazz.getDeclaredConstructor().newInstance();method.invoke(obj);} catch (Exception e) {e.printStackTrace();}}
}

反射与注解的结合

反射和注解经常结合使用,特别是在框架开发中。通过反射,可以在运行时读取注解信息并执行相应的逻辑。

示例代码

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;// 定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {String value();
}// 使用注解
public class FrameworkExample {@MyAnnotation("Hello, Framework!")public void process() {System.out.println("处理业务逻辑");}public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("FrameworkExample");// 创建对象Object obj = clazz.getDeclaredConstructor().newInstance();// 获取所有方法Method[] methods = clazz.getMethods();for (Method method : methods) {// 检查方法是否被注解if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("注解值: " + annotation.value());method.invoke(obj);}}} catch (Exception e) {e.printStackTrace();}}
}

总结

Java反射和注解是Java语言中两个强大的特性。反射允许在运行时检查和操作类、对象、接口、字段和方法,而注解则提供了一种元数据形式,用于为代码提供附加信息。通过结合使用反射和注解,开发者可以构建灵活、可扩展的框架和应用。

希望本文能帮助读者深入理解Java反射和注解的使用方法和实际应用场景,从而在实际开发中更加高效地利用这些特性。

相关文章:

Java学习手册:Java反射与注解

Java反射&#xff08;Reflection&#xff09;和注解&#xff08;Annotation&#xff09;是Java语言中两个强大的特性&#xff0c;它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法&#xff0c;而注解则提供了一种元数据形…...

21 天 Python 计划:MySQL事务四大隔离级别深度剖析

文章目录 一、事务1.1 什么是事务&#xff1f;1.2 事务的四大特性 二、事务并发存在的问题2.1 脏读&#xff08;dirty read&#xff09;2.2 不可重复读&#xff08;unrepeatable read&#xff09;2.3 幻读 三、事务的四大隔离级别实践3.1 读未提交&#xff08;Read Uncommitted…...

IO多路复用沉浸式体验

这篇文章主要讲解一下IO多路复用常见问题&#xff0c;包含常见面试题&#xff0c;对你有帮助的话可以留个赞和关注嘛&#xff1f;谢谢大家支持&#xff01; 1.epoll 相比于 select/poll 的优点有哪些&#xff1f; 高效的数据结构&#xff1a;epoll使用红黑树管理fd&#xff0…...

音视频学习(三十三):GOP详解

GOP 概念 GOP&#xff08;图像组&#xff09;是视频编码中一组帧的集合(按相关性分组)&#xff0c;它从一个关键帧&#xff08;I帧&#xff09;开始&#xff0c;后面跟随若干个参考帧&#xff08;P帧&#xff09;和预测帧&#xff08;B帧&#xff09;。其结构决定了视频帧的压…...

部署YUM仓库

目录 一.YUM 1.1yum概述 1.2yum的实现 1.3yum服务的组成 1.4yum服务实现过程 1.5yum配置文件位置 二.yum相关命令 三.搭建yum仓库的方式 3.1使用HTTP方式搭建yum仓库 准备工作&#xff08;服务端和客户端都需要做&#xff09; 服务端 客户端 3.2使用ftp方式搭建yu…...

中位数学习(低估它了)

-----------------------------------------------------------------中位数------------------------------------------------------- 中位数有一个很好的性质&#xff1a;假设有一批数据&#xff0c;你想找一个数&#xff0c;使得这批数据与它差的绝对值的和最小&#xff0…...

音视频转换器 AV 接口静电保护方案

方案简介 音视频转换器是将音视频&#xff08;AV&#xff09;信号转换成其他格式或信号类型的设备或软件。 它能够实现大多数视频、音频以及图像格式之间的转换&#xff0c;包括但不限于 RMVB、AVI、 MP4、MOV 等常见格式&#xff0c;同时也支持将不同采样率、位深度、声道数…...

蓝桥杯嵌入式第十二届省赛程序设计1(超简单版)

此程序只需要会C语言数组&#xff0c;结构体(struct)&#xff0c;for , if , switch(也可以用if)就能够实现。 引脚设置&#xff1a; 引脚配置&#xff08;参照笔记&#xff09;&#xff1a; 代码部分&#xff1a; /* USER CODE END Header */ /* Includes ------------------…...

CSS 链接样式学习笔记

在网页设计中&#xff0c;链接&#xff08;<a> 标签&#xff09;是不可或缺的元素&#xff0c;通过 CSS 可以对链接进行丰富的样式设置&#xff0c;从而提升用户体验和页面美观度。以下是关于 CSS 链接样式的详细学习笔记。 一、链接的四种状态 链接有四种不同的状态&a…...

有ts文件却无法ts出来解决办法

一开始报错是报这个&#xff0c;但是我其实完全看不懂为什么 原因是这个 打开某个test就行了...

javaSE.Lambda表达式

如果一个接口中有且只有一个待实现的抽象方法&#xff0c;那么我们可以将匿名内部类简写为Lambda表达式。 简写规则 标准格式&#xff1a; &#xff08;【参数类型 参数名称&#xff0c;】...&#xff09; -> {代码语句&#xff0c; 包括返回值} 只有一行花括号{}可以省略。…...

Web渗透之文件包含漏洞

文件包含漏洞原理 1、源代码 <?php$filename $_GET[filename]; include $filename; //或include_once,require,require_onceecho "欢迎来到PHP的世界.";?> 2、利用条件 php.ini中alllow_url_fopenOn(默认开启)和allow_url_includeOff(默认关闭)要开启…...

费马引理和罗尔定理

cheer 向……欢呼&#xff0c;使高兴&#xff0c;欢呼&#xff0c;欢呼&#xff0c;愉快 前言区间平均值费马引理罗尔三步万能构造原函数的方法什么时候用罗尔定理计划拉格朗日需要记忆的不等式柯西中值定理泰勒高阶导数判断极值最后 前言 继续学习。今天争取把讲义和作业题都…...

【合新通信】浸没式液冷中低成本冷媒开发的最新进展

浸没式液冷光模块是一种结合高效散热技术与光通信的新型解决方案&#xff0c;主要用于数据中心、超算中心等高密度计算场景。其核心特点是通过将光模块直接浸入绝缘冷却液中&#xff08;如矿物油、氟化液等&#xff09;&#xff0c;实现高效散热和节能降耗。低成本冷却液的研发…...

【开发记录】服务外包大赛记录

参加服务外包大赛的A07赛道中&#xff0c;最近因为频繁的DEBUG&#xff0c;心态爆炸 记录错误 以防止再次出现错误浪费时间。。。 2025.4.13 项目在上传图片之后 会自动刷新 没有等待后端返回 Network中的fetch /upload显示canceled. 然而这是使用了VS的live Server插件才这样&…...

智能指针之设计模式1

本文探讨一下智能指针和GOF设计模式的关系&#xff0c;如果按照设计模式的背后思想来分析&#xff0c;可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然&#xff0c;它们也不是严格意义上面向对象的设计模式&#xff0c;毕竟它们没有那么分明的类层次体系&…...

Spring Boot 中应用的设计模式

Spring Boot 中应用的设计模式详解 Spring Boot 作为 Spring 框架的扩展&#xff0c;广泛使用了多种经典设计模式。以下是主要设计模式及其在 Spring Boot 中的具体应用&#xff1a; 一、创建型模式 1. 工厂模式 (Factory Pattern) 应用场景&#xff1a; BeanFactory 和 Ap…...

23种GoF设计模式

GoF&#xff08;Gang of Four&#xff09;设计模式是由四位计算机科学家 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的书籍《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的设计模式 目录 一、创建型模式&#xff08;Cre…...

Python实例题:Python实现中文错别字高亮系统

目录 Python实例题 题目 安装依赖库 代码实现 代码解释 运行思路 注意事项 Python实例题 题目 Python实现中文错别字高亮系统 安装依赖库 在开始之前&#xff0c;你需要安装 pycorrector 和 rich 库。可以使用以下命令进行安装&#xff1a; pip install pycorrecto…...

【第三十一周】ViT 论文阅读笔记

ViT 摘要Abstract文章信息引言方法Patch EmbeddingPatch Position EmbeddingTransformer EncoderMLP Head整体架构CNN的归纳偏置 代码实现实验结果总结 摘要 本篇博客介绍了Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是一种突破性的图像分类模型&#xff…...

射频(RF)静电放电防护方案

方案简介 射频&#xff08;RF&#xff09;是 Radio Frequency 的缩写&#xff0c;表示可以辐射到空间的电磁频率&#xff0c;频率 范围从 300kHz&#xff5e;300GHz 之间。射频就是射频电流&#xff0c;简称 RF&#xff0c;它是一种高频交流变化 电磁波的简称。射频天线是一…...

【redis进阶三】分布式系统之主从复制结构(1)

目录 一 为什么要有分布式系统&#xff1f; 二 分布式系统涉及到的非常关键的问题&#xff1a;单点问题 三 学习部署主从结构的redis (1)创建一个目录 (2)进入目录拷贝两份原有redis (3)使用vim修改几个选项 (4)启动两个从节点服务器 (5)建立复制&#xff0c;要想配…...

排序(1)

排序&#xff08;1&#xff09; 日常生活中&#xff0c;有很多场景都会用到排序。比如你买东西&#xff0c;在购物软件就有几种展现方式&#xff0c;按照评论数量给你排序出来&#xff0c;让你选&#xff0c;还是说按照价钱高低排序出来让你选。 排序其实是一种为了更好解决问…...

NR 5G中的N5接口

N5接口的定义: Reference point between the PCF and an AF or TSN AF. 即N5 PCF和AF之间的参考点。 AF Application Function 应用功能&#xff0c;指应用层的各种服务&#xff0c;可以是运营商内部的应用如Volte AF(类似4G的Volte As&#xff09;、也可以是第三方的AF&…...

STM32自学进阶指南:从入门到精通的成长路径 | 零基础入门STM32第九十九步

主题内容教学目的/扩展视频自学指导通过数据手册和搜索引擎查找资料,独立解决问题以积累经验和提升能力。自学过程中应保持敬畏之心,不断总结未知领域,持续进步。师从洋桃电子,杜洋老师 📑文章目录 一、自学指导全景图1.1 学习路线对比1.2 关键学习策略二、待探索技术领域…...

利用 Python 进行股票数据可视化分析

在金融市场中&#xff0c;股票数据的可视化分析对于投资者和分析师来说至关重要。通过可视化&#xff0c;我们可以更直观地观察股票价格的走势、交易量的变化以及不同股票之间的相关性等。 Python 作为一种功能强大的编程语言&#xff0c;拥有丰富的数据处理和可视化库&#xf…...

用 Vue.js 构建基础购物车:从 0 到 1 的实战解析

在当今数字化购物的浪潮中&#xff0c;购物车功能已成为电商平台不可或缺的一部分。它不仅承担着记录用户所选商品的重任&#xff0c;还需提供流畅的交互体验和精准的计算逻辑。本文将深入探讨如何利用 Vue.js 这一强大的 JavaScript 框架&#xff0c;逐步搭建一个基础但功能完…...

MapSet常用的集合类(二叉搜索树,哈希表)

Set集合 Set的核心特点&#xff1a; Set继承了Collection。 保存的元素不会重复。 保存的元素不能修改。 保存的元素无序&#xff0c;和List不同&#xff0c;如果有两个&#xff1a;List {1&#xff0c;2&#xff0c;3}&#xff0c;List {2&#xff0c;1&#xff0c;3}&…...

五种IO模型

1、通信的本质&#xff1a; 通过网络通信的学习&#xff0c;我们能够理解网络通信的本质是进程间通信&#xff0c;而进程间通信的本质就是IO。 IO也就是input和output。当读取条件不满足的时候&#xff0c;recv会阻塞。write写入数据时&#xff0c;会将数据拷贝到缓冲区中&am…...

路由器开启QOS和UPNP的作用

QOS 的作用 保障关键业务带宽&#xff1a;可根据网络应用的重要性分配带宽。比如在家庭网络中&#xff0c;当多人同时使用网络时&#xff0c;将视频会议等实时性要求高的关键业务设置为高优先级&#xff0c;确保其能获得足够带宽&#xff0c;避免卡顿&#xff0c;而文件下载等…...

学习MySQL的第九天

纸上得来终觉浅 绝知此事要躬行 数据处理的增删查改 一、添加数据 添加数据有两种方式&#xff0c;一种是一条一条的添加数据&#xff0c;另一种是通过对其他表的查询&#xff0c;将查询的结果插入到表中&#xff1b;第一种方式又可以分为三种方式&#xff1a…...

怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改

​ 现在非常流行glb格式模型&#xff0c;和gltf格式文件&#xff0c;可是之类模型网站非常非常少 1&#xff0c;咱们先直接打开http://glbxz.com 官方glb下载网站 glbxz.com 2 可以搜索&#xff0c;自己想要的模型关键词 3&#xff0c;到自己想下载素材页面 4&#xff0c;…...

高效数据拷贝方法总结

1.系统/语言层面的高效拷贝 内存拷贝优化 使用memcpy(C/C)或类似函数进行大块内存拷贝 利用SIMD指令(如AVX/SSE)进行向量化拷贝 2.零拷贝技术 文件映射(mmap) - 将文件映射到内存空间 发送文件描述符而非数据本身(Unix域套接字) 使用sendfile系统调用(文件到套接字直接传…...

C 语言 第八章 文件操作

目录 文件操作 文件和流的介绍 C 输入 & 输出 C 文件的读写 创建/打开文件 写入文件 fputc 函数 fputs 函数 fprintf 函数 实例&#xff1a; 读取文件 fgets函数 实例&#xff1a; 关闭文件 文件操作 文件和流的介绍 变量、数组、结构体等数据在运行时存储于内存…...

开发一款游戏需要哪些岗位角色参与?

常见分类 1. 游戏策划&#xff08;Game Designer&#xff09; 核心职责&#xff1a;设计游戏的玩法、规则、内容和整体体验。 具体工作&#xff1a; 系统设计&#xff1a;设计游戏的战斗、经济、成长、社交等核心系统。 数值设计&#xff1a;平衡角色属性、装备数值、经济系…...

大模型面经 | 手撕多头注意力机制(Multi-Head Attention)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

二叉树的初步学习

前言 对于二叉树的学习不想其他数据结构一样&#xff0c;直接学习他的结构的构建。单纯的一个二叉树在实际中没什么作用&#xff0c;除非是加了限制条件的&#xff0c;比如大名鼎鼎的红黑树。但是对于初学者而言&#xff0c;刚开始就学习红黑树&#xff0c;会让你刚接触就想放…...

Tkinter菜单和工具栏的设计

在这一章中,我们将深入探讨如何在Tkinter应用程序中设计菜单和工具栏。菜单和工具栏是桌面应用程序中常见的界面元素,它们为用户提供了便捷的操作方式。通过这一章的学习,您将能够在您的Tkinter应用中添加菜单栏和工具栏,提升用户体验。 6.1 菜单栏的设计 菜单栏是应用程…...

windows中搭建Ubuntu子系统

windows中搭建虚拟环境 1.配置2.windows中搭建Ubuntu子系统2.1windows配置2.1.1 确认启用私有化2.1.2 将wsl2设置为默认版本2.1.3 确认开启相关配置2.1.4重启windows以加载更改配置 2.2 搭建Ubuntu子系统2.2.1 下载Ubuntu2.2.2 迁移位置 3.Ubuntu子系统搭建docker环境3.1安装do…...

Docker 部署 Kafka 完整指南

Docker 部署 Kafka 完整指南 本指南将详细介绍如何使用 Docker 部署 Kafka 消息队列系统&#xff0c;包括单节点和集群模式的部署方式。 1. 单节点部署 (Zookeeper Kafka) 1.1 创建 docker-compose.yml 文件 version: 3.8services:zookeeper:image: bitnami/zookeeper:3.8…...

java学习总结(if switch for)

一.基本结构 1.单分支if int num 10; if (num > 5) {System.out.println("num 大于 5"); } 2.双分支if-else int score 60; if (score > 60) {System.out.println("及格"); } else {System.out.println("不及格"); } 3.多分支 int…...

解释:指数加权移动平均(EWMA)

指数加权移动平均&#xff08;EWMA, Exponential Weighted Moving Average&#xff09; 是一种常用于时间序列平滑、异常检测、过程控制等领域的统计方法。相比普通移动平均&#xff0c;它对最近的数据赋予更高权重&#xff0c;对旧数据逐渐“淡化”。 ✅ 一、通俗理解 想象你…...

open harmony多模组子系统分析

multimodalinput是open harmony的核心输入子系统&#xff0c;负责统一管理触摸屏&#xff0c;键盘&#xff0c;鼠标&#xff0c;手势&#xff0c;传感器等多种 输入源&#xff0c;提供标准化事件分发机制。其核心 目标是通过统一的事件处理框架&#xff0c;实现跨设备&#xff…...

Hello Java!

1. Java发展史 1.1 计算机编程语言分类 机器语言&#xff1a;电子机器能够直接识别的语言&#xff0c;无需经过翻译&#xff0c;计算机内部就有相应的电路来完成它&#xff1b;从使用的角度来看&#xff0c;机器语言是最低级的语言。 机器语言。指令以二进制代码形式存在。 汇…...

vue 入门:生命周期

文章目录 vue组件的生命周期创建阶段更新阶段销毁阶段生命周期钩子函数 vue组件的生命周期 创建阶段、销毁阶段&#xff1a;只会执行一次更新阶段&#xff1a;会执行多次 创建阶段 beforeCreate 在实例初始化之后&#xff0c;数据观测&#xff08;data observer&#xff09;…...

C#容器源码分析 --- Dictionary<TKey,TValue>

Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合&#xff0c;其核心实现基于​​哈希表​​和​​链地址法&#xff08;Separate Chaining&#xff09;。 .Net4.8 Dictionary<TKey,TValue>源码地址&#xff1a; dictionary…...

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件&#xff0c;可以在相应的应用商店或者官网进行下载&#xff0c;这样对于用户来说十分的方便和便捷。而在Linux上&#xff0c;也有类似的安装方式&#xff0c;我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…...

MCU刷写——HEX与S19文件互转详解及Python实现

工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex与S19这这两种文件互相转化,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走…...

深入探讨避免MQ消息重复消费的策略与实现

引言 随着微服务架构的流行&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;作为系统间异步通信的重要手段&#xff0c;被广泛应用于各种场景。然而&#xff0c;在使用MQ的过程中&#xff0c;一个不容忽视的问题是消息可能被重复消费。这不仅可能导致数据不一致…...

定制一款国密浏览器(8):SM3 摘要算法

上一章我们讲到了铜锁和 BoringSSL,本章从最简单的国密算法 SM3 摘要算法入手,说明一下 SM3 算法的移植要点。 SM3 算法本身并不复杂,详细算法说明参考《GB∕T 32905-2016信息安全技术 SM3密码杂凑算法》这份文档。因为铜锁开源项目有实现代码,直接照搬过来。 将 crypto/…...