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

Java反射详细学习笔记

动态代理

特点 : 无侵入式的给代码增加额外的功能 ;

代理里面就是对象要被代理的方法 ;

通过接口保证,后面的对象和代理需要实现同一个接口 , 接口中就是被代理的所有方法 ;

如何为java对象创建一个代理 :

  • java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的方法 :

    public static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h)
    参数一 : 用于指定用那个类加载器,去加载生成的代理类
    参数二 : 指定接口,这些接口用于指定生成的代理长什么,也就是什么方法
    参数三 : 用来指定生成的代理对象要干什么事情

实例代码 :

首先是一个需要代理的对象 : BigStar :

package com.it.yss;
​
public class Bigstar implements Star{private String name ;
​public Bigstar() {}
​public Bigstar(String name) {this.name = name;}
​// 唱歌 , 跳舞@Overridepublic String sing(String name){System.out.println(this.name+"正在唱 : " + name);return "谢谢" ;}
​@Overridepublic void dance(){System.out.println(this.name+"正在跳舞。") ;}
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
}

定义接口Star,指定需要被代理的方法 :

package com.it.yss;
​
public interface Star {// 我们可以把所有想被代理的方法定义在接口当中
​// 唱歌public abstract String sing(String name) ;
​// 跳舞public abstract void dance() ;
​
}

创建代理ProxyUtil :

package com.it.yss;
​
​
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
​
/**** 类的作用 :*  创建一个代理**/
public class ProxyUtil {/*** 方法的作用 :*  给一个明星的对象 ,创建一个代理** 形参 :*  被代理的明星对象**  返回值 :*      给明星创建的代理**  需求 :*      外面的人想要大明星唱一首歌*      1 . 获取代理的对象*          代理对象 = ProxyUtil.createProxy(大明星的对象)*      2 . 再 调用代理的唱歌对象*          代理对象.唱歌的方法("歌曲的名称") ;*/public static Star createProxy(Bigstar bigstar){/*java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的方法
​public static Object newProxyInstance(ClassLoader,Class<?>[] interfaces,InvocationHandler h)参数一 : 用于指定用那个类加载器,去加载生成的代理类参数二 : 指定接口,这些接口用于指定生成的代理长什么,也就是什么方法参数三 : 用来指定生成的代理对象要干什么事情
​*/Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),//参数一 : 用于指定用那个类加载器,去加载生成的代理类new Class[]{Star.class},//指定接口,这些接口用于指定生成的代理长什么,也就是什么方法// 参数三 : 用来指定生成的代理对象要干什么事情new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/*** 参数一 : 代理的对象* 参数二 : 要运行的方法 sing* 参数三 : 调用sing方法时 , 传递的实参*/if("sing".equals(method.getName())){System.out.println("准备话筒 , 收钱");}else if("dance".equals(method.getName())){System.out.println("准备场地 , 收钱");}// 去找大明星唱歌或者跳舞// 代码的表现形式 : 调用大明星里面唱歌或者跳舞的方法return method.invoke(bigstar,args);}}) ;
​return star ;
​
​
​}
}

测试 :

package com.it.yss;
​
public class test {public static void main(String[] args) {
//     *  需求 :
//     *      外面的人想要大明星唱一首歌
//                *      1 . 获取代理的对象
//                *          代理对象 = ProxyUtil.createProxy(大明星的对象)
//                *      2 . 再 调用代理的唱歌对象
//                *          代理对象.唱歌的方法("歌曲的名称") ;// 1 . 获取代理的对象Bigstar bigstar = new Bigstar("鸡哥") ;Star proxy = ProxyUtil.createProxy(bigstar) ;
​// 2 . 调用唱歌的方法String result = proxy.sing("只因你太美") ;System.out.println(result);
​// 3 . 调用跳舞的方法proxy.dance();}
}

调用步骤 :

反射

概念 :

反射 :

反射允许对封装类的成员变量,成员方法和构造方法的信息进行编程访问 ;

一个类包括 :

  • 字段(成员变量)

  • 构造方法

  • 成员方法

而反射就可以将这些获取出来 , 例如idea中的类方法或构造函数参数提示就是依靠反射实现的 :

获取class对象的三种方式 :

  1. Class.forName("全类名")

  2. 类名.class

  3. 对象.getClass() ;

代码实例 :

package com.it.yss;
​
public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {/***  获取class对象的三种方式 :*         1. Class.forName("全类名")*         2. 类名.class*         3. 对象.getClass() ;*/// 1. 第一种方式// 全类名 : 包名 + 类名 com.it.yss.Student// 最为常用的Class Clazz = Class.forName("com.it.yss.Student");// 打印 :System.out.println(Clazz);
​// 2 .第二种方式// 一般更多的是当作参数进行传递Class Clazz2 = Student.class ;System.out.println(Clazz2==Clazz);
​// 3 . 第三种方式// 当有了这个类的对象的时候 , 才能使用Student stu = new Student();Class Clazz3 = stu.getClass();System.out.println(Clazz3==Clazz2);}
}

可以看到全是相等的 ,输出结果 :

class com.it.yss.Student
true
true

在java中 , 万事皆可看作对象 :

获取构造方法 :

实例 :

Student类 :

package com.it.myreflect2;
​
public class Student {private String name ;private int age;
​public Student() {}
​public Student(String name){this.name = name;}
​public Student(int age){this.age = age;}
​public Student(String name, int age) {this.name = name;this.age = age ;}
​public String getName(){return name;}
​public void setName(String name){this.name = name;}
​public int getAge(){return age;}
​public void setAge(int age){this.age = age;}
​@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

1 . 获取字节码文件对象 :

Class clazz = Class.forName("com.it.myreflect2.Student");

2 . 获取构造方法

        // 2 . 2 获取所有构造方法Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor c : cons2) {System.out.println(c);}
​System.out.println("------------------------");
​// 2 . 3 获取空参构造方法Constructor con1 = clazz.getDeclaredConstructor() ;System.out.println(con1);
​System.out.println("------------------------");
​// 2 . 4 获取对应的构造方法(传入对应参数的字节码文件)Constructor con2 = clazz.getDeclaredConstructor(String.class);System.out.println(con2);Constructor con3 = clazz.getDeclaredConstructor(int.class);System.out.println(con3);Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);System.out.println(con4);
​System.out.println("------------------------");

输出结果 :

public com.it.myreflect2.Student()
public com.it.myreflect2.Student(java.lang.String)
------------------------
public com.it.myreflect2.Student()
public com.it.myreflect2.Student(java.lang.String)
protected com.it.myreflect2.Student(int)
private com.it.myreflect2.Student(java.lang.String,int)
------------------------
public com.it.myreflect2.Student()
------------------------
public com.it.myreflect2.Student(java.lang.String)
protected com.it.myreflect2.Student(int)
private com.it.myreflect2.Student(java.lang.String,int)
------------------------

3 . 获取构造方法修饰权限符

// 3 获取方法修饰权限符
int modifiers = con4.getModifiers();
System.out.println(modifiers);
​
System.out.println("------------------------");

这里输出结果是2 , 看api文档可以发现2对应的是private ;

4 . 获取构造方法参数

用con.getParameters()来获得对应的参数列表 :

Parameter[] parameters = con4.getParameters();
for (Parameter p : parameters) {System.out.println(p);
}

输出结果 :

java.lang.String arg0
int arg1

5 . 用反射创建对象

// 暴力反射 : 临时取消权限校验(原本是私有构造方法)
con4.setAccessible(true);
// 创建对象
Student stu = (Student) con4.newInstance("张三",23);
System.out.println(stu);

输出结果 :

Student{name='张三', age=23}

利用反射获取成员变量

Student类 :

package com.it.myreflect3;
public class Student {private String name ;private int age;public String gender ;public Student() {}public Student(int age, String gender, String name) {this.age = age;this.gender = gender;this.name = name;}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}

1 . 获取成员变量 :

        // 2 . 获取成员变量Field[] fields1 = clazz.getFields() ;//获取公共Field[] fields2 = clazz.getDeclaredFields() ;// 获取所有for(Field f : fields1){System.out.println(f);}System.out.println("--------------");for(Field f : fields2){System.out.println(f);}System.out.println("--------------");// 获取单个成员变量Field gender = clazz.getDeclaredField("gender");System.out.println(gender);

输出结果 :

public java.lang.String com.it.myreflect3.Student.gender
--------------
private java.lang.String com.it.myreflect3.Student.name
private int com.it.myreflect3.Student.age
public java.lang.String com.it.myreflect3.Student.gender
--------------
public java.lang.String com.it.myreflect3.Student.gender

2 . 获取权限修饰符

int modifiers = gender.getModifiers();
System.out.println(modifiers);

输出结果 :

1

1代表public

3 . 获取成员变量,类型

String ys = gender.getName() ;
System.out.println(ys);
Class<?> type = gender.getType();
System.out.println(type);

输出结果 :

gender
class java.lang.String

4 . 获取成员变量记录的值

Student s = new Student(23,"男","张三");
Object value = gender.get(s) ;
System.out.println(value);

输出结果 :

5 . 修改对象里面记录的值

gender.set(s,"女");
System.out.println(s);

输出结果 :

Student{name='张三', age=23, gender='女'}

获取成员方法

Student类 :

package com.it.myreflect4;
​
import java.io.IOException;
​
public class Student {private String name ;private int age;
​public Student() {}
​private Student(String name, int age) {this.name = name;this.age = age ;}
​public void sleep(){System.out.println("睡觉");}
​private String eat(String food) throws IOException {System.out.println("在吃"+food);return "奥里给" ;}
​public String getName(){return name;}
​public void setName(String name){this.name = name;}
​public int getAge(){return age;}
​public void setAge(int age){this.age = age;}
​@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

注 : 多加了eat()和sleep();

完整代码 :

package com.it.myreflect4;
​
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
​
public class test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {// 1 . 获取字节码文件对象Class clazz = Class.forName("com.it.myreflect4.Student");
​// 2 . 获取所有的方法对象(包含父类中所有的公共方法)Method[] methods= clazz.getMethods();for(Method method:methods){System.out.println(method);}
​//获取所有的方法对象(不能获取父类的,但是可以获取本类中私有的方法)Method[] methods1= clazz.getDeclaredMethods();for(Method method:methods1){System.out.println(method);}
​// 获取指定的单一方法Method m = clazz.getDeclaredMethod("eat", String.class) ;System.out.println(m);
​// 获取方法的修饰符int modify = m.getModifiers();System.out.println(modify);
​// 获取方法的名字String name = m.getName() ;System.out.println(name);
​// 获取方法的形参Parameter[] ps = m.getParameters();for(Parameter p : ps){System.out.println(p);}
​// 获取方法抛出的异常 :Class[] exceptionTypes = m.getExceptionTypes();for(Class exceptionType : exceptionTypes){System.out.println(exceptionType);}
​// 方法运行/*Method类中用于创建对象的方法Object invoke(Object obj,Object... args): 运行方法参数一 : 用obj对象调用该方法参数二 : 调用方法的传递的参数(如果没有就不写)返回值: 方法的返回值(如果没有就不写)*/Student s = new Student() ;m.setAccessible(true);String ts = (String) m.invoke(s, "汉堡包");System.out.println(ts);
​}
}

输出结果 :

public java.lang.String com.it.myreflect4.Student.getName()
public java.lang.String com.it.myreflect4.Student.toString()
public void com.it.myreflect4.Student.sleep()
public void com.it.myreflect4.Student.setName(java.lang.String)
public int com.it.myreflect4.Student.getAge()
public void com.it.myreflect4.Student.setAge(int)
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public java.lang.String com.it.myreflect4.Student.getName()
public java.lang.String com.it.myreflect4.Student.toString()
public void com.it.myreflect4.Student.sleep()
public void com.it.myreflect4.Student.setName(java.lang.String)
private java.lang.String com.it.myreflect4.Student.eat(java.lang.String) throws java.io.IOException
public int com.it.myreflect4.Student.getAge()
public void com.it.myreflect4.Student.setAge(int)
private java.lang.String com.it.myreflect4.Student.eat(java.lang.String) throws java.io.IOException
2
eat
java.lang.String arg0
class java.io.IOException
在吃汉堡包
奥里给

反射的作用

  1. 获取一个类里面的所有的信息 , 获取到之后,再执行其它的业务逻辑

  2. 结合配置文件,动态的创建对象并调用方法

总结 :

相关文章:

Java反射详细学习笔记

动态代理 特点 : 无侵入式的给代码增加额外的功能 ; 代理里面就是对象要被代理的方法 ; 通过接口保证,后面的对象和代理需要实现同一个接口 &#xff0c; 接口中就是被代理的所有方法 ; 如何为java对象创建一个代理 : java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的…...

区块链在艺术市场中的创新:数字艺术品的溯源与版权保护

随着数字技术的迅猛发展&#xff0c;数字艺术品正逐渐成为艺术市场的重要组成部分。然而&#xff0c;数字艺术品的复制和版权问题日益突出&#xff0c;传统的版权管理方式面临挑战。区块链技术作为一种去中心化的分布式账本技术&#xff0c;为解决这些问题提供了新的可能性。本…...

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势&#xff1a;挑战&#xff1a; 《CSS创意项目实践&…...

鸿蒙界面开发

界面开发 //构建 → 界面 build() {//行Row(){//列Column(){//文本 函数名(参数) 对象.方法名&#xff08;参数&#xff09; 枚举名.变量名Text(this.message).fontSize(40)//设置文本大小.fontWeight(FontWeight.Bold)//设置文本粗细.fontColor(#ff2152)//设置文本颜色}.widt…...

【JavaScript】use strict

“use strict” 声明时&#xff0c;代码将会在严格模式下执⾏。严格模式包含了⼀些额外的规则和限制。 使⽤ “use strict” 的主要作⽤包括&#xff1a; 变量必须声明后再使⽤&#xff0c;不能通过不使⽤关键字创建全局变量不能通过 delete 操作符删除变量&#xff08;包括对…...

Linux云计算 |【第一阶段】SERVICES-DAY3

主要内容&#xff1a; 分离解析介绍、NTP时间服务、基础邮件服务&#xff08;MX记录&#xff09;、部署postfix邮件服务器、自定义YUM仓库 实操提前准备&#xff1a; ① 设置SELinux、关闭防火墙服务&#xff08;两台主机&#xff09; [rootsvr7 ~]# getenforce Permissive …...

Java面试八股之Spring-boot-starter-parent的作用是什么

Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM&#xff08;Project Object Model&#xff09;&#xff0c;它主要的作用是提供一系列默认的配置和依赖管理&#xff0c;以便简化项目的构建过程。以下是spring-boot-sta…...

Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL

在使用 Amazon S3 存储服务时,我们经常需要获取存储桶中对象的 HTTPS URL。这篇博文将详细介绍如何使用 Python 和 Boto3 库来实现这一功能。 背景 Amazon S3(Simple Storage Service)是一种广泛使用的云存储服务。在许多场景中,我们需要获取 S3 存储桶中对象的公开访问 …...

V-bind动态绑定style的案例集合

目录 绑定对象 绑定数组 绑定函数 V-bind 动态绑定 Class 的案例集合-CSDN博客 绑定对象 示例代码如下: <!--html--> <p :style="{width:widthVal,height:heightVal,border:borderVal}">段落</p> <!--js--> data(){ ret…...

深度学习守护夜行安全:夜视行人检测系统详解

基于深度学习的夜视行人检测系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 引言 夜视行人检测在自动驾驶和智能监控中至关重要。然而&#xff0c;由于光线不足&#xff0c;夜间行人检测面临巨大挑战。深度学习技术&#xff0c;特别是YOLO&#xff08;You…...

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…...

如何减少白屏的时间

前端性能优化是前端开发中一个重要环节&#xff0c;它包括很多内容&#xff0c;其中页面的白屏时间是用户最初接触到的部分&#xff0c;白屏时间过长会显著影响用户的留存率和转换率。 我们以一个 APP 内嵌 Webview 打开页面作为例子&#xff0c;来分析页面打开过程以及可优化…...

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破

近日&#xff0c;未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展&#xff0c;最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度&#xff0c;充分利用现有计算资源&#xff0c;显著提升长安链交易处理速度。 随着区块…...

go语言学习文档精简版

Go语言是一门开源的编程语言&#xff0c;目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力&#xff0c;以及在现代语言中所见到的高级特性。 你好&#xff0c;Go package main // 程序组织成包import "fmt" // fmt包用于格式化输出数据// …...

立元科技-Java面经

面试时间&#xff1a;2024年2月13日 面试地点&#xff1a;线下 面试流程&#xff1a;一轮面试 首先写了点笔试题&#xff0c;但是人家根本不看&#xff08;这个也就一面&#xff09; &#xff08;聊的还行&#xff0c;但是公司环境不是特别的好&#xff0c;一次面试&#x…...

OpenGL入门第六步:材质

目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,…...

新版SpringSecurity5.x使用与配置

目录 一、了解SpringSecurity 1.1 什么是Spring Security&#xff1f; 1.2 Spring Security功能 1.3 Spring Security原理 1.4 RABC (Role-Based Access Control) 二、SpringSecurity简单案例 2.1 引入SpringSecurity依赖 2.2 创建一个简单的Controller 三、SpringSecu…...

JavaScript实战 - JavaScript 中实现线程锁

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言&#xff1a; …...

基于PaddleClas的人物年龄分类项目

目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求&#xff0c;需要将图像中的人物区分为成人和小孩&#xff0c;这是一个典型的二分类问题…...

20240725java的Controller、DAO、DO、Mapper、Service层、反射、AOP注解等内容的学习

在Java开发中&#xff0c;‌controller、‌dao、‌do、‌mapper等概念通常与MVC&#xff08;‌Model-View-Controller&#xff09;‌架构和分层设计相关。‌这些概念各自承担着不同的职责&#xff0c;‌共同协作以构建和运行一个应用程序。‌以下是这些概念的解释&#xff1a;‌…...

dynslam的安装

1. 安装opencv 2.4.9 下载opencv2.4.9 apt-get install build-essential apt-get install libgtk2.0-dev libavcodec-dev libavformat-dev libtiff4-dev libswscale-dev libjasper-dev apt-get install cmake apt-get install pkg-config 进入安装包文件&#xff1a; m…...

stats 监控 macOS 系统

Stats 监控 macOS 系统 CPU 利用率GPU 利用率内存使用情况磁盘利用率网络使用情况电池电量 brew install stats参考 stats github...

后端面试题日常练-day05 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备&#xff0c;答案在文末 在Java中&#xff0c;以下哪个关键字用于表示方法重写&#xff08;Override&#xff09;&#xff1f; a) override b) overrule c) overwrite d) supercede Java中的HashMap和Hashtable有什么区别&am…...

mac|安装PostgreSQL

1、官网下载&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 选择需要的版本&#xff1a; 双击得到的.dmg文件 双击&#xff0c;弹窗选择打开&#xff0c;一路next&#xff0c;然后输入你要设置的密码&#xff0c;默认账号名字为&#xff1a;postgres…...

内网对抗-隧道技术篇防火墙组策略FRPNPSChiselSocks代理端口映射C2上线

知识点&#xff1a; 1、隧道技术篇-传输层-工具项目-Frp&Nps&Chisel 2、隧道技术篇-传输层-端口转发&Socks建立&C2上线Frp Frp是专注于内网穿透的高性能的反向代理应用&#xff0c;支持TCP、UDP、HTTP、HTTPS等多种协议。可以将内网服务以安全、便捷的方式通过…...

arinc664总线协议

AFDX总线协议简介 &#xff08;1&#xff09;AFDX的传输速率高&#xff1a;带宽100MHZ&#xff0c;远远高于其他的类型的航空总线。&#xff08;2&#xff09;AFDX网络的鲁棒性高&#xff1a;AFDX的双冗余备份网络可以在某一个网络出现故障时&#xff0c;仍能正常通讯。 其中…...

UNIX 域协议

1. UNIX域协议 利用socket编程接口实现本地进程间通信 UNIX域协议套接字&#xff1a;可以使用TCP&#xff0c;也可以使用UDP SOCK_STREAM -----> TCP 面向字节流 SOCK_DGRAM -----> UDP 面向数据报 UNIX域协议并不是一个实际的协议族&#xff0c;而是在单个主机上执…...

昇思25天学习打卡营第17天|LLM-基于MindSpore的GPT2文本摘要

打卡 目录 打卡 环境准备 准备阶段 数据加载与预处理 BertTokenizer 部分输出 模型构建 gpt2模型结构输出 训练流程 部分输出 部分输出2&#xff08;减少训练数据&#xff09; 推理流程 环境准备 pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspo…...

Clion开发STM32——移植FreeModbus

STM32型号 &#xff1a;STM32H743VIT6 FreeModbus版本 &#xff1a;1.6 使用工具&#xff1a;stm32cubeMX&#xff0c;Clion 使用STM32作从机&#xff0c;模式&#xff1a;RTU 网上用keil的比较多&#xff0c;用Clion的比较少&#xff0c;如果你也用Clion&#xff0c;那么希望…...

c++栈笔记

一种常见的数据结构&#xff0c;遵循后进先出&#xff0c;先进后出的原则。地址不连续&#xff0c;栈顶&#xff08;top&#xff09; 1.常见函数 stack<int> s;定义一个参数类型为int 的栈 名为ss.push()向栈中插入元素s.emplace()压栈&#xff0c;无返回值s.pop()删除…...