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

JavaSE反射机制干货

1.反射(Relection)     理解
        定义:程序运行状态,动态地获取程序信息及调用程序功能即为java反射机制
    2.获取class对象       掌握
        2.1 Java代码的3个阶段
            Java代码在计算机中经历的三个阶段:Source源代码阶段-Class类对象阶段-Runtime运行阶段
            2.1.1 源代码(source):不是.java文件;而是编译器后生成的.class文件。.class文件包含了原始文件中所有信息
            2.1.2 类对象(class):字节码文件(.class)被类加载器加载到虚拟机中,可通过".class"文件获取原始类中的所有信息,随之被加载的类就生成了一个Class类对象
            2.1.3 运行时(runtime):通过new关键字创建对象(以类为模板创建对象),或使用Class对象的newInstance()方法创建对象
        2.2 获取Class对象的原因
            字节码被加载进入虚拟机后,随之加载的类就生成了一个Class对象,获取Class对象就可获取关于类的属性、方法和构造方法等信息,同时Class对象也是java反射机制的起源和入口
        2.3 获取Class对象的方式
            2.3.1 已知具体的类,通过类的class属性获取,此方法最安全可靠,程序性能最高 
                例如 Class<User> clazz = User.class;
            2.3.2 已知某个类的具体实例,可调用该实例的getClass()方法获取Class对象
                例如:User user = new  User(); Class<? extends User> clazz = user.getClass();
            2.3.3 已知类的全名,通过Class类的静态方法forName(String className)获取,但是可能会抛出ClassNotFoundException 
                例如: Class<?> clazz = Class.forName("com.xx.entity.User");
        2.4 Class可以指那些结构
            java语言中,Class可以指任意Java类型。通过class属性,可以获得基本数据类型、void、数组、枚举、接口、泛型和类等类型的Class对象。
        2.5 关于Class对象总结
            通过.class属性获取、通过对象的getCLss()方法获取、通过forName获取、通过类加载器获取
            以上4种方式获取的Class对象的哈希值一模一样
                -- 通过类加载器获取Class对象
                ClassLoader classloader = ClassLoader.getSystemClassLoder();
                Class<?> clazz = classloader.loadClass("类的完整路径");
                Sout(clazz.hasCode);
            
    3.类的加载过程           理解
        3.1 加载类分析
            字节码文件需加载到虚拟机中使用。
            加载字节码文件三步骤:装载、连接、初始化
            3.1.1 装载(loading) 类的class文件读入内存,并创建一个java.lang.Class对象,由类加载器完成
            3.1.2 连接(linking) 
                3.1.2.1 验证(Verify)  确保加载类的信息复合JVM规范 
                3.1.2.2 准备(Prepare) 正式为静态变量在方法区中开辟存储空间并设置默认值。
                3.1.2.3 解析(Resolve) 将虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程
            3.1.3 初始化(initialization) 执行类构造器<clinit>()方法的过程,也就是把编译时期自动收集类中所有静态变量的赋值动作和静态代码块中的赋值语句合并。
                    <clinit> ()方法对于类或接口来说并不是必须的,如果一个类中没有静态语句块,也没有对变量的赋值操作,那么编译器可以不为这个类生成clinit()方法。
        3.2 类的加载器分析
            3.2.1 类加载器作用:将字节码文件加载到虚拟机内存
            3.2.2 类加载器分类
                启动类加载器(BootStrapClassLoader,也可称引导类加载器)
                扩展类加载器(ExtensionClassLoader)
                应用类加载器(SystemClassLoader,也称应用类加载器)
                自定义类加载器(UserClassLoader)
                -- 从启动类加载器到应用类加载器可通过getParent()方法分别获取上层的父加载器,但是三者之间不存在继承关系,而是属性关系
                3.2.2.1 引导类加载器(BootStrap ClassLoader)
                    使用C/C++实现,嵌套在JVM内部,通过Java代码无法获得
                    用于加载Java核心库,用于提供JVM自身需要的类
                    并非继承java.lang.ClassLoader,没有父加载器
                    出于安全考虑,Bootstrap加载器只加载java,javax,sun开头的类
                3.2.2.2 扩展类加载器(Expression ClassLoader)
                    由java语言编写,继承自ClassLoader类
                    父加载器为启动类加载器
                    负责加载从JDK安装目录jre/lib/ext子目录下加载类库
                3.2.2.3 应用类加载器(System ClassLoader)
                    java语言编写,继承自ClassLoader类
                    父加载器为扩展类加载器
                    负责加载环境变量classpath或系统属性java.class.path指定路径下的类(加载自定义类)
                3.2.2.4 用户自定义类加载器(User ClassLoader)
                    自定义类加载通过需要继承ClassLoader,父加载器为系统加载器
            3.2.3 双亲委派模型
                某个特定的类加载器接收到加载类的请求时,首先将加载任务委托给父类加载器,父类加载器又将任务向上委托,直到最父类加载器,
                如果父类加载器可以完成类加载任务,就成功返回,如果不行就向下委托,由子类加载器进行加载。
                双亲委派可避免类的重复加载,确保类的唯一性,同时保护程序安全,防止核心API被改写。
    4.通过反射创建对象     掌握
        4.1 newInstance()方法
            可通过获取的Class对象来调用newInstance()方法,来实例化一个对象
            通过Class对象调用newInstance()方法,默认会调用无参构造方法来创建对象 
            调用newInstance()方法,如果该类没有提供无参构造方法,则会抛出InstantiationException异常
            如果该类的无参构造方法权限不够,则会抛出IllegalAccessException异常 
            由于该方法需要满足具备无参构造方法,并且该无参构造方法的权限需要足够,因为newInstance()方法具备很大的局限性。
            开发中,想通过反射机制创建对象,一般都是通过Constructor类提供的方法实现。
        4.2 使用反射的经典案例
            使用new关键字创建对象,创建对象的代码是死的,每次只能创建1个对象
            灵活而动态的创建对象,则可通过反射机制创建。例如将需要创建对象的类名写在配置文件中,读取配置文件中的类型然后再反射进行实例化,就可实现不编辑代码实现灵活创建。
    5.获得类的所有结构     了解
        5.1 获取类的相关信息
            String getName(); --获取带包名的类型
            String getSimpleName(); --获取不带包名的类型
            Package getPackage(); --获取类的包对应的对象
            Class<?> getSupperClass(); --获取类的父类对象
            Class<?>[] getInterfaces(); --获取类实现的接口
        5.2 获取类的所有属性
            Field[] getFields(); --获取当前类和父类公开的属性
            Field[] getDeclaredFields(); --获取当前类所有权限的属性
            
            Field类常见方法:
                String getName(); -- 获取属性名
                Class<?> Type(); --获取属性类型
                int getModifiers(); --获取属性修饰符,返回类型为数字,通过Modifier.toString将数组类型转换为字符串类型的修饰符
        5.3 获取类的所有方法
            Method[] getMethods(); --获取当前类和父类公开的方法
            Method[] getDeclaredMethods(); --获取当前类所有权限的方法 
            
            Method类常见方法:
                int getModifiers(); --获取属性修饰符,返回类型为数字,通过Modifier.toString将数组类型转换为字符串类型的修饰符
                Class<?> getReturnType --以Class类型方式获取返回值类型
                String getName(); --获取方法名
                Class<?>[] getParameterTypes(); --获得方法形参类型
        5.4 获取类的所有构造方法
            Constructor[] getConstructors(); --获取当前类公开的构造方法
            Constructor[] getDeclaredConstructors(); --获取当前类所有权限的构造方法
            
            Constructor类常用方法:
                int getModifiers(); --获取属性修饰符,返回类型为数字,通过Modifier.toString将数组类型转换为字符串类型的修饰符
                String getName(); --获取方法名
                Class<?>[] getParameterTypes(); --获取方法的形参类型
    6.操作类的所有结构     重点
        6.1 操作类中的属性(成员变量、静态变量)
            获得属性的Field对象方法:
                获得某个公开权限的属性(包含父类):public Field getField(String name)
                获得当前类的某个属性(任意权限,常用于获取私有权限):public Filed getDeclaredField(String name)
                
            操作属性的方法如下:
                获得Obj对象中对应的属性值:public void get(Object obj)
                设置obj对象中对应的属性值:public void set(Object obj,Object value)
                参数值为true,代表允许操作私有属性:public void setAccessible(boolean isflag)
                判断两个Field对象是否相等:public boolean equals(Object obj)
                
            实例-操作公开权限的成员变量
                获得Triger类的Class对象:Class<?> clazz = Class.forName("com.xx.entity.Triger");
                获得Triger类中公开的name属性: Field field = clazz.getField("name");
                通过反射机制来实例化Triger对象:Object obj = clazz.newInstance();
                给name成员变量赋值:field.set(obj,"jack");
                获得name成员变量值:String name = (String) field.get(obj);
                
            实例2-操作私有权限的成员变量(仅显示和操作公开权限的成员变量的不同点)
                获取Triger类中私有的color属性: Field colorFiled = clazz.getDeclaredField("color");
                设置允许操作私有属性:colorField.setAccessible(true);
                
            实例3-操作私有权限的静态变量(无需明确静态变量属于那个对象,操作静态变量绑定的对象设置为null即可)
                获得Triger类的class对象:Class<?> clazz = Class.forName("com.xx.entity.Triger");
                获取Triger类中私有的color属性:Field colorFiled = clazz.getDeclaredField("color");
                设置允许操作私有数量的成员变量:colorField.setAccessible(true);
                给colorFiled静态变量赋值:colorField.set(null,"black");
                获取colorField静态变量值:String color = (String) colorField.get(null);
                
        6.2 操作类中的方法
            获得方法的Method对象方法:
                获得公开权限的方法(包含父类):public Method getMethod(String name,Class<?>... parameterTypes) name为方法名,parameterTypes为形参类型
                获得当前类的某个方法(任意权限):public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
                
            操作方法的方式如下:
                调用某个方法:public Object incoke(Object obj,Object...args) obj表示绑定的对象,args表示传递的实参值.返回值为调用方法返回的结果,返回结果为null,表示无返回值
                参数值为true,代表可调用私有方法:public void setAccessible(boolean flag) 
            
            实例:调用公开权限的成员方法
                获得User类的Class对象:Class<?> calzz = Class.forName("com.xx.entity.User");
                获得User类的公开的show(String)方法:Method showMethod = clazz.getMethod("show",String.class);
                通过反射机制实例化User对象:Object obj = clazz.newInstance();
                调用show方法:Object result = showMethod.invoke(obj,"小明");如果value为null,表示该方法无返回值
                
            实例2-调用私有权限的成员方法
                获取User类的Class对象:Class<?> clazz = Class.forName("com.xx.entity.User");
                获取User类的私有的look(String,int)方法:Method lookMethod = clazz.getDeclaredMethod("look",String.class,int.class);
                通过反射机制实例化User对象:Object obj = clazz.newInstance();
                设置私有look方法可操作的权限:lookMethod.setAccessible(true);
                调用look方法:Object value = lookMethod.invoke(obj,"小明",13); 如果value为null,表示该方法无返回值
                
            实例3-调用私有权限的静态方法(无需明确静态方法属于那个对象,调用静态方法绑定的对象设置为Null即可)
                获取User类的Class对象:Class<?> clazz = User.class;
                获取User类的私有的sleep(String)静态方法:Method sleepMethod = clazz.getDeclaredMethod("sleep",String.class);
                设置私有静态方法可调用:sleepMethod.setAccessible(true);
                调用sleep静态方法,并获取返回值:Object value = sleepMethod.inovke(null,"小明"); 如果invoke方法的返回值为null,表示该方法无返回值
        6.3 操作类中的构造方法
            获得构造方法的Constructor对象方法:
                获取公开权限的构造方法:public Constructor<?> getConstructor(Class<?>...parameterTypes) 参数为构造方法的形参类型
                获取任意权限的构造方法:public Constructor<?> getDeclaredConstructor(Class<?>...parameterTypes) 参数为构造方法的形参类型
                
                调用指定的构造方法创建对象,形参为构造方法需要传递的参数:public T newInstance(Object...initargs) 
                参数值为true,代表可以操作私有构造方法:public void setAccessible(boolean flag)
            实例-通过公开权限的构造方法来创建对象
                获取User类的class对象:Class<?> clazz = Class.forName("com.xx.entity.User");
                获取公开权限的有参构造方法:Constructor<?> con = clazz.getConstructor(String.class);
                调用有参构造方法来创建对象:User user = (User)con.newInstance("小明");
            
            实例2-通过私有权限的构造方法来创建对象
                获取User类的class对象:Class<?> clazz = Class.forName("com.xx.entity.User");
                获取私有权限的有参构造方法:Constructor<?> con = clazz.getDeclaredConstructor(String.class,Double.class);
                设置允许操作私有权限的构造方法:con.setAccessible(true);
                调用有参构造方法来创建对象:User user = (User)con.newInstance("小明",19.0);
            通过构造方法对象Constructor的newInstance创建对象比Class调用newInstance()方法灵活很多。常用Constructor创建对象
    7.反射中泛型的使用     了解
    8.反射的实战案例     掌握
        8.1 榨果汁案例
            需求:不改变程序代码的前提,创建出继承自Fruit的任意对象(Apple,Banana,Orange),然后调用榨汁机的方法开启榨汁操作
            实现方案:定义抽象类Fruit,包含抽象方法squeeze;定义三个类都继承Fruit抽象类,重写squeeze方法;定义榨汁类,类中包含榨汁方法,参数为Fruit;
                    创建配置文件,定义完整的类名;测试类中读取配置文件类名,然后通过forName静态方法反射实例化对象,最后实例化榨汁类调用方法即可。
                    (想调用那个类的方法,修改配置文件中的类名即可)
        8.2 模拟简单框架
            配置文件中定义完整类名路径和类中的方法名
            读取配置文件的完整类名和方法名
            通过反射获取Class对象,然后通过Class对象获取构造方法和普通方法对象,再然后通过Constructor实例化对象
            最后调用Method对象的invoke方法调用普通方法

相关文章:

JavaSE反射机制干货

1.反射(Relection) 理解 定义&#xff1a;程序运行状态,动态地获取程序信息及调用程序功能即为java反射机制 2.获取class对象 掌握 2.1 Java代码的3个阶段 Java代码在计算机中经历的三个阶段:Source源代码阶段-Class类对象阶段-Runt…...

[特殊字符] 第十一讲 | 空间回归模型实战:SAR / SEM / GWR逐个击破

&#x1f4d8; 专栏&#xff1a;科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者&#xff1a;平常心0715 &#x1f511; 本讲关键词&#xff1a;空间滞后模型&#xff08;SAR&#xff09;、空间误差模型&#xff08;SEM&#xff09;、地理加权回归&#xff08;G…...

AI前沿周报:2025年3月技术深度解析

以下是基于2024-2025年AI技术前沿动态的深度技术周报示例&#xff0c;结合行业最新突破与研究进展&#xff0c;突出技术原理与应用场景分析&#xff1a; AI前沿周报&#xff1a;2025年3月技术深度解析 时间范围&#xff1a;2025年3月1日-3月31日 本期焦点&#xff1a;模型透明…...

aidigu开源微博项目程序,PHP开发的开源微博系统,自媒体个人创业、网盘推广首先

一、软件介绍 文末提供程序和源码下载学习 PHP开发的开源微博系统&#xff0c;采用PHP MySQL开发&#xff0c;框架采用ThinkPHP5.1&#xff0c;用户登录后拥有专属ID&#xff0c;支持表情、关注用户&#xff0c;网盘分享等功能&#xff0c;支持图片上传,视频上传,网盘存储分享…...

Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor

Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor Decision ManifoldsTabNet1.核心思想2. 架构组成3. 工作流程4. 优点PyTorch TabNetTabNetRegressor参数1. 模型相关参数`n_d``n_a``n_steps``gamma``cat_idxs``cat_dims``cat_emb_dim`2. 训练相关参数`opti…...

格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商!

格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商! 为飞手赋能&#xff0c;为赛事护航! Tattu是深圳市格瑞普电池有限公司(Grepow)旗下的子品牌之一&#xff0c;专注为无人机、FPV和模型爱好者提供专业可靠的电池和充电器等一站式电源解决方案。凭借卓越的放电性能、稳…...

PySide6 监测设备变更事件

在PySide6中监听系统事件&#xff0c;判断是否有串口设备插拔&#xff0c;进而当串口状态变更时&#xff0c;实现列表数据实时更新。 在Qt中&#xff0c;可以使用 nativeEvent 接口来完成这一操作&#xff1a; [virtual protected] bool QWidget::nativeEvent(const QByteArray…...

嵌入式系统的历史与发展​

目录 引言​ 一、嵌入式系统的早期萌芽​ 1、首个现代嵌入式系统 2、早期未成形嵌入式系统的应用 二、以单片机为主的初级阶段​ 1、工业领域应用 2、大型家电领域应用 三、处理器升级与多样化应用阶段​ 1、数字化电子化设备涌现 &#xff08;1&#xff09;智能仪表…...

mysql调试记录

ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; 该命令在调试python使用pymysql连接数据库出现错误时&#xff0c; 报错为pymysql.err.OperationalError: (1045, "Access denied for user rootlocalhost (using password: NO)") m…...

【后端开发】Spring MVC阶段总结

文章目录 快捷引入依赖lombok的使用Lombok依赖Lombok使用Lombok注解 三层架构分层的目的MVC与分层的区别三层架构分层的好处 企业命名规范常见命名命名风格介绍大驼峰风格小驼峰风格包名 常见注解Cookie与Session 快捷引入依赖 这个方法可以快捷引入依赖&#xff0c;但是引入依…...

netty-socketio + springboot 消息推送服务

netty-socketio springboot 消息推送服务 后端1. 目录结构&#xff1a;代码pom文件&#xff1a;application.yml&#xff1a;SocketIOConfig&#xff1a;PushMessage&#xff1a;ISocketIOServiceSocketIOServiceImpl&#xff1a;pushMessageController&#xff1a;启动类&…...

基于 JavaWeb 的 SSM 在线视频教育系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

同时打开多个Microchip MPLAB X IDE

0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具&#xff0c;使用的MCU是Microchip SAMD21J18A MCU…...

dify 500错误

问题 升级到1.2.0 后所有页面接口均报错500, 环境&#xff1a; docker 本地部署 version:1.2.0 解决办法 1.首先关闭服务 docker compose down2.找到docker-compose.yaml里的plugin_daemon&#xff0c;参照下面修改参数 plugin_daemon:environment:PLUGIN_MAX_EXECUTION…...

WPF设计标准学习记录26

画刷名称功能说明SolidColorBrush使用单一的连续颜色填充区域LinearGradientBrush使用线性渐变绘制区域。RadialGradientBrush使用径向渐变绘制区域。 焦点定义渐变的开始,而圆定义渐变的终点。ImageBrush使用图像绘制区域。VisualBrush使用一个视图绘制区域。BitmapCacheBrus…...

cin,cin.get(),getchar(),getline(),cin.get line()异同点

文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等价于cin.operator>>()&#xff0c;即调用成员函数operator>>()进行读取数据。 &#xff08;2&#xff09;当cin>>从缓冲区中读取数据时&…...

7# 5多线-7 不会停

7# 5多线-7 不会停 分析&#xff0c;明显线接错了&#xff0c;打自动时也能手动启停&#xff0c;打手动无法启停&#xff0c;这时远程只能启ka3,无法启ka4。排查手自转换2上没接线&#xff0c;接到8上了&#xff08;13和12接错了&#xff0c;也就是sac的5和6接错了&#xff09;…...

基于混合编码器和边缘引导的拉普拉斯金字塔网络用于遥感变化检测

Laplacian Pyramid Network With HybridEncoder and Edge Guidance for RemoteSensing Change Detection 0、摘要 遥感变化检测&#xff08;CD&#xff09;是观测和分析动态土地覆盖变化的一项关键任务。许多基于深度学习的CD方法表现出强大的性能&#xff0c;但它们的有效性…...

机器学习 从入门到精通 day_04

1. 决策树-分类 1.1 概念 1. 决策节点 通过条件判断而进行分支选择的节点。如&#xff1a;将某个样本中的属性值(特征值)与决策节点上的值进行比较&#xff0c;从而判断它的流向。 2. 叶子节点 没有子节点的节点&#xff0c;表示最终的决策结果。 3. 决策树的…...

CLAHE算法介绍

限制对比度自适应直方图增强 CLAHE 算法介绍 1. CLAHE算法框图2.直方图clip及重分配2.1 opencv自带2.2 scikit-image2.3 结果对比2.4 clip limit的性质3.插值参考文献上图来自 K. Zuiderveld: Contrast Limited Adaptive Histogram Equalization。 图中可以看到各种直方图均衡的…...

高并发的业务场景下,如何防止数据库事务死锁

一、 一致的锁定顺序 定义: 死锁的常见原因之一是不同的事务以不同的顺序获取锁。当多个事务获取了不同资源的锁,并且这些资源之间发生了互相依赖,就会形成死锁。 解决方法: 确保所有的事务在获取多个锁时,按照相同的顺序请求锁。例如,如果事务A需要锁定表A和表B,事务…...

使用Python从零实现一个端到端多模态 Transformer大模型

嘿&#xff0c;各位&#xff01;今天咱们要来一场超级酷炫的多模态 Transformer 冒险之旅&#xff01;想象一下&#xff0c;让一个模型既能看懂图片&#xff0c;又能理解文字&#xff0c;然后还能生成有趣的回答。听起来是不是很像超级英雄的超能力&#xff1f;别急&#xff0c…...

elestio memos SSRF漏洞复现(CVE-2025-22952)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前言…...

倚光科技:以创新之光,雕琢全球领先光学设计公司

在光学技术飞速发展的当下&#xff0c;每一次突破都可能为众多领域带来变革性的影响。而倚光&#xff08;深圳&#xff09;科技有限公司&#xff0c;作为光学设计公司的一颗璀璨之星&#xff0c;正以其卓越的创新能力和深厚的技术底蕴&#xff0c;引领着光学设计行业的发展潮流…...

Linux安装Elasticsearch详细教程

准备工作 下载地址:Download Elasticsearch | Elastic 下载时需要注意es与jdk版本对应关系 ES 7.x 及之前版本&#xff0c;选择 Java 8 ES 8.x 及之后版本&#xff0c;选择 Java 17 或者 Java 18&#xff0c;建议 Java 17&#xff0c;因为对应版本的 Logstash 不支持 Java 1…...

C++字符串操作详解

引言 字符串处理是编程中最常见的任务之一&#xff0c;而在C中&#xff0c;我们有多种处理字符串的方式。本文将详细介绍C中的字符串操作&#xff0c;包括C风格字符串和C的string类。无论你是C新手还是想巩固基础的老手&#xff0c;这篇文章都能帮你梳理字符串处理的关键知识点…...

PromptPro|提示词生成和管理专家

大家好&#xff0c;我是吾鳴。 今天吾鳴给大家分享一个实用的提示词管理网站&#xff0c;它的名称叫做产品化管理提示词&#xff0c;英文名叫做PromptPro&#xff0c;是一个可以帮你管理你的大模型提示词的网站&#xff0c;同时你也可以告诉它你的需求&#xff0c;让它帮你生成…...

计算机视觉图像特征提取入门:Harris角点与SIFT算法

计算机视觉图像特征提取入门&#xff1a;Harris角点与SIFT算法 一、前言二、Harris 角点检测算法​2.1 Harris 角点的定义与直观理解​2.1.1 角点的概念​2.1.2 Harris 角点的判定依据​ 2.2 Harris 角点检测的实现步骤​2.2.1 计算图像的梯度​2.2.2 构建结构张量矩阵​2.2.3 …...

swift菜鸟教程1-5(语法,变量,类型,常量,字面量)

一个朴实无华的目录 今日学习内容&#xff1a;1.基本语法引入空格规范输入输出 2.变量声明变量变量输出加反斜杠括号 \\( ) 3.可选(Optionals)类型可选类型强制解析可选绑定 4.常量常量声明常量命名 5.字面量整数 and 浮点数 实例字符串 实例 今日学习内容&#xff1a; 1.基本…...

02142数据结构导论

初学者&#xff0c;怎样理解这道题&#xff0c;怎样大白话分析 答案解析 00、概念 29、 28、 27、 26、 25、 24、 23、 22、有5个元素&#xff0c;其入栈次序为&#xff1a;A、B、C、D、E,写出以元素C、D最先出栈(即C第一个且D第二个出栈)的各种可能的出栈次序。 (来…...

如何在AMD MI300X 服务器上部署 DeepSeek R1模型?

DeepSeek-R1凭借其深度推理能力备受关注&#xff0c;在语言模型性能基准测试中可与顶级闭源模型匹敌。 AMD Instinct MI300X GPU可在单节点上高效运行新发布的DeepSeek-R1和V3模型。 用户通过SGLang优化&#xff0c;将MI300X的性能提升至初始版本的4倍&#xff0c;且更多优化将…...

【Django】教程-15-注册页面

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

OpenAI即将上线新一代重磅选手——GPT-4.1

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

参照Spring Boot后端框架实现序列化工具类

本文参照Jackson实现序列化工具类&#xff0c;旨在于简化开发 JacksonUtil.class public class JacksonUtil {private JacksonUtil() {}/*** 单例*/private final static ObjectMapper OBJECT_MAPPER;static {OBJECT_MAPPER new ObjectMapper();}private static ObjectMappe…...

C_内存 内存地址概念

1. 计算机内存的基本概念 计算机的内存&#xff08;RAM&#xff0c;随机存取存储器&#xff09;是用来存储程序运行时的数据和指令的地方。内存被划分为许多小单元&#xff0c;每个单元有一个唯一的地址&#xff0c;这些地址从0开始编号。 内存单元&#xff1a;每个内存单元通…...

Rust重定义数据库内核:从内存安全到性能革命的破界之路

Rust语言正在颠覆传统数据库开发范式&#xff0c;其独特的所有权系统与零成本抽象能力&#xff0c;为攻克C/C时代遗留的内存泄漏、并发缺陷等顽疾提供全新解决方案。本文通过TiKV、Materialize等新一代数据库核心组件的实践案例&#xff0c;剖析Rust如何重塑存储引擎、查询优化…...

tree 显示到二级目录

要使用 tree 命令显示到二级目录,可以通过 -L 参数指定目录层级。具体命令如下: tree -L 2 参数说明: -L 数字:控制显示的目录深度。-L 2 表示显示到第二级目录(即当前目录下的直接子目录及其内容)。 示例输出: 复制 . ├── dir1 │ ├── file1.txt │ └─…...

UE5 在UE中创建骨骼动画

文章目录 创建动画的三种方式修改骨骼动画 创建动画的三种方式 方法一 打开一个已有的动画&#xff0c;左上角“创建资产/创建动画/参考姿势” 这将创建一个默认的A字形的骨骼&#xff0c;不建议这么做 方法二 打开一个已有的动画&#xff0c;左上角“创建资产/创建动画/当前…...

工业相机使用笔记

目前工业相机有多种分类方式&#xff0c;以下是基于不同原理和特点的类别总结&#xff1a; 按维度分类 2D相机&#xff1a; 原理&#xff1a;通过镜头将二维平面上的物体成像在图像传感器上&#xff0c;传感器上的像素点阵列捕捉物体的光信号&#xff0c;并转换为电信号或数字…...

深度兼容性测试和自助兼容性测试的区别,如何正确的选择?

泽众云经过几年业务快速发展&#xff0c;特别是泽众云兼容性测试服务已成为市场热门供应商之一&#xff0c;也根据用户不同需求推出了超高性价比服务&#xff0c;主要有深度兼容性测试和自助兼容性测试两种方式。2025年上半云真机平台的机型已升级到1000&#xff0c;全面覆盖了…...

Windows下安装depot_tools

一、引言 Chromium和Chromium OS使用名为depot_tools的脚本包来管理检出和审查代码。depot_tools工具集包括gclient、gcl、git-cl、repo等。它也是WebRTC开发者所需的工具集&#xff0c;用于构建和管理WebRTC项目。本文介绍Windows系统下安装depot_tools的方法。 二、下载depo…...

学术分享:基于 ARCADE 数据集评估 Grounding DINO、YOLO 和 DINO 在血管狭窄检测中的效果

一、引言 冠状动脉疾病&#xff08;CAD&#xff09;作为全球主要死亡原因之一&#xff0c;其早期准确检测对有效治疗至关重要。X 射线冠状动脉造影&#xff08;XCA&#xff09;虽然是诊断 CAD 的金标准&#xff0c;但这些图像的人工解读不仅耗时&#xff0c;还易受观察者间差异…...

NLP高频面试题(四十一)——什么是 IA3 微调?

随着大型语言模型的广泛应用,如何高效地将这些模型适配到特定任务中,成为了研究和工程实践中的重要课题。IA3(Infused Adapter by Adding and Adjusting)微调技术,作为参数高效微调的一种新颖方法,提供了在保持模型性能的同时,显著减少可训练参数数量的解决方案。 IA3 …...

STM32 模块化开发指南 · 第 3 篇 环形缓冲区 RingBuffer 模块设计与单元测试

本文是《STM32 模块化开发实战指南》第 3 篇,聚焦于“如何设计一个高性能、稳定、安全的环形缓冲区模块”。我们将从基本结构讲起,逐步完成接口定义、边界处理、API 实现与单元测试,最终实现一个可移植、线程安全、可嵌入 UART/BLE/协议模块的通用 RingBuffer。 一、RingBuf…...

软件测试岗位:IT行业中的质量守护者

在当今数字化飞速发展的IT行业&#xff0c;软件如同空气般无处不在&#xff0c;从日常的手机应用到复杂的企业级管理系统&#xff0c;软件的稳定性和可靠性至关重要。而软件测试岗位的从业者&#xff0c;就像是软件世界的质检员&#xff0c;精心守护着软件的质量。 一、软件测…...

单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发

在电子产品设计中&#xff0c;单片机&#xff08;MCU&#xff09;无疑是最重要的组成部分之一。无论是消费电子、智能家居、工业控制&#xff0c;还是可穿戴设备&#xff0c;小家电等&#xff0c;单片机的应用无处不在。 单片机&#xff0c;简而言之&#xff0c;就是将计算机…...

恐龙专利及商标维权行动,已获批TRO并冻结资金

2025年3月30日&#xff0c;原告Shenzhen xingyin technology co.,Ltd.&#xff0c;现化名为Shenzhen Z Tech Co., Ltd.委托kemet律所发起维权。目前该案件已获批TRO临时禁令&#xff0c;涉案账户资金已被冻结&#xff0c;案件详情如下&#xff1a; 案件基本情况&#xff1a;起…...

【北京市小客车调控网站-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

Vue 3中的 setup

Vue 3引入了Composition API&#xff0c;其中setup函数是这一新API的核心部分。setup函数为开发者提供了一种更灵活、更模块化的方式来组织组件逻辑。以下是关于Vue 3中setup函数的详细解释&#xff1a; 1. 基本概念 setup函数是组件内使用Composition API的入口点。它是一个…...

2025年实用新型专利审查周期要多久?

申请实用新型专利时&#xff0c;审查周期是申请人最关心的问题之一。尤其是近几年国家知识产权局不断优化流程&#xff0c;审查速度是否有变化&#xff1f;2025年申请需要等多久&#xff1f;本文结合最新政策和实际案例&#xff0c;为你全面解析&#xff01; 一、实用新型专利…...