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

JavaSE学习笔记25-反射(reflection)

反射

在Java中,反射(Reflection) 是一种强大的机制,允许程序在运行时检查和操作类、方法、字段等信息。通过反射,可以动态地创建对象、调用方法、访问字段,甚至修改私有成员。反射的核心类是 java.lang.reflect 包中的 ClassMethodFieldConstructor 等。

反射的常见用法

以下是反射的常见用法

1. 获取 Class 对象

Class 对象是反射的核心,表示一个类或接口的元数据。可以通过以下方式获取 Class 对象:

// 1. 通过类名获取
Class<?> clazz = Class.forName("java.lang.String");// 2. 通过对象获取
String str = "Hello";
Class<?> clazz = str.getClass();// 3. 通过类字面量获取
Class<?> clazz = String.class;

2. 创建对象

通过反射可以动态创建类的实例:

Class<?> clazz = Class.forName("java.lang.String");
// 使用无参构造函数创建对象
Object obj = clazz.getDeclaredConstructor().newInstance();

 如果构造函数有参数,可以这样:

Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
Object obj = constructor.newInstance("Hello, Reflection!");

3. 调用方法

通过反射可以动态调用方法:

Class<?> clazz = Class.forName("java.lang.String");
Object obj = clazz.getDeclaredConstructor().newInstance();// 获取方法对象
Method method = clazz.getMethod("substring", int.class, int.class);// 调用方法
String result = (String) method.invoke(obj, 0, 5);
System.out.println(result); // 输出子字符串

4. 访问字段

通过反射可以访问和修改字段的值:

class MyClass {private String name = "Reflection";
}Class<?> clazz = MyClass.class;
Object obj = clazz.getDeclaredConstructor().newInstance();// 获取字段对象
Field field = clazz.getDeclaredField("name");// 设置字段可访问(即使是私有字段)
field.setAccessible(true);// 获取字段值
String nameValue = (String) field.get(obj);
System.out.println(nameValue); // 输出: Reflection// 修改字段值
field.set(obj, "New Value");
System.out.println(field.get(obj)); // 输出: New Value

5. 访问私有成员

通过 setAccessible(true) 可以绕过访问控制,访问私有成员(字段、方法、构造函数):

class MyClass {private void privateMethod() {System.out.println("Private Method Called!");}
}Class<?> clazz = MyClass.class;
Object obj = clazz.getDeclaredConstructor().newInstance();// 获取私有方法
Method method = clazz.getDeclaredMethod("privateMethod");// 设置方法可访问
method.setAccessible(true);// 调用私有方法
method.invoke(obj); // 输出: Private Method Called!

反射的优缺点

优点:

  • 动态性:可以在运行时动态加载类、调用方法、访问字段。

  • 灵活性:适用于框架和库的开发(如 Spring、Hibernate)。

缺点:

  • 性能开销:反射操作比直接调用慢。

  • 安全性问题:可以绕过访问控制,破坏封装性。

  • 代码可读性差:反射代码通常难以理解和维护。


反射的使用场景

  • 框架开发:如 Spring 的依赖注入、Hibernate 的 ORM 映射。

  • 动态代理:如 JDK 动态代理。

  • 工具类:如 JSON 库(Gson、Jackson)的序列化和反序列化。


反射示例代码

以下是一个完整的反射示例:

import java.lang.reflect.*;public class ReflectionExample {public static void main(String[] args) throws Exception {// 获取 Class 对象Class<?> clazz = Class.forName("java.lang.String");// 创建对象Object obj = clazz.getDeclaredConstructor(String.class).newInstance("Hello, Reflection!");// 调用方法Method method = clazz.getMethod("substring", int.class, int.class);String result = (String) method.invoke(obj, 0, 5);System.out.println(result); // 输出: Hello// 访问字段(假设有一个私有字段)Field field = clazz.getDeclaredField("value");field.setAccessible(true);byte[] value = (byte[]) field.get(obj);System.out.println(new String(value)); // 输出: Hello, Reflection!}
}

 通过反射,Java 提供了强大的动态能力,但应谨慎使用,避免滥用导致性能问题和代码复杂性。

静态vs动态语言


动态语言
    是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,
    已有的函数可以被删除或是其他结构上的变化。通俗说就是在运行时代码可以根据某些条件改变自身结构
    主要动态语言:Object-C、C#、Javascript、PHP、Python等。
静态语言
    与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++
    Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制获得
    类似动态语言的特性。Java的动态性让编程的时候更加灵活!

笔记

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
并能直接操作任意对象的内部属性及方法
    语法: Class c = Class.forName("java.lang.String")
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就
包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,
所以,我们形象的称之为:反射
    正常方式:引入需要的“包类”名称 --》 通过new实例化 --》取得实例化对象
    反射方式:实例化对象 --》getClass()方法 --》 得到完整的“包类”名称

Java反射机制提供的功能
    在运行时判断任意一个对象所属的类
    在运行时构造任意一个类的对象
    在运行时判断任意一个类所具有的成员变量和方法
    在运行时获取泛型信息
    在运行时调用任意一个对象的成员变量和方法
    在运行时处理注解
    生成动态代理
    ....

优点:实现动态创建对象和编译,体现出很大的灵活性

缺点:对性能有影响。使用反射基本上是一直解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。
这类操作总是慢于 直接执行相同的操作

反射相关的主要API
java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Filed:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器
...

Class类


在Object类中定义了以下的方法,此方法将被所有子类继承
    public final Class getClass()
    这个方法的返回值的类型是一个Class类,此类是Java反射的源头
    实际上所谓反射从程序的运行结果看也很好理解,即:可以通过对象反射求出类的名称

对象照镜子后可以得到的信息,某个类的属性,方法,和构造器,某个类到底实现了哪些接口
对于每个类而言,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了特定某个
结构(class/interface/enum/annotation/primitive type/void/[])的有关信息

Class本身也是一个类
Class对象只能由系统建立对象
一个加载的类在JVM中只会有一个Class实例
一个Class对象对应的是一个加载到JVM中的一个.class文件
每个类的实例都会记得自己是由哪个Class实例所生成
通过Class可以完整地得到一个类中的所有被加载的结构
Class类是Reflection的根源,针对任何你想动态加载,运行的类,唯有先获得相应的Class对象

Class类的常用方法
static ClassforName(String name)  返回指定类名name的Class对象
Object newInstance()              调用缺省构造函数,返回Class对象的一个实例
getName()                         返回此Class对象所表示的实体(类,接口,数组类或void)的名称
Class getSuperClass()             返回当前Class对象的父类的Class对象
Class[] getinterface()            获取当前Class对象的接口
ClassLoader getClassLoader()      返回该类的类加载器
Constructor[] getConstructors()   返回一个包含某些Constructor对象的数组
Method getMethod(String name,Class..T)  返回一个Method对象,此对象的形参类型为paramType
Field[] getDeclaredFields()       返回Field对象的一个数组

练习代码:

package com.kuang.reflection;public class Test02 {public static void main(String[] args) throws ClassNotFoundException {// 创建一个 Persons 对象Persons persons = new Student();Persons persons1 = new Teacher();System.out.println("这个人是:" + persons.name);System.out.println("这个人是:" + persons1.name);// 方式一:通过对象的 getClass() 方法获取 Class 对象Class c1 = persons.getClass();System.out.println("c1的哈希值:" + c1.hashCode());// 方式二:通过 Class.forName() 方法获取 Class 对象Class c2 = Class.forName("com.kuang.reflection.Student");System.out.println("c1的哈希值:" + c2.hashCode());//方式三:通过类名 .class 获取Class对象Class c3 = Student.class;System.out.println("c3的哈希值:" + c3.hashCode());//方式四:基本内置类型的包装类都有一个Type属性Class c4 = Integer.TYPE;System.out.println("c4的类名:" + c4.getName());//获得父类类型Class c5 = c1.getSuperclass();System.out.println("c5的父类类型:" + c5);}
}class  Persons{public String name;public Persons(){}public Persons(String name){this.name = name;}@Overridepublic String toString() {return "Persons{" +"name='" + name + '\'' +'}';}
}class Student extends Persons{public Student(){this.name = "学生";}
}class Teacher extends Persons{public Teacher(){this.name = "老师";}
}

主要演示了 Java 反射机制 的使用,包括如何获取类的 Class 对象、获取父类类型,以及基本数据类型的 Class 对象。以下是对代码的详细解释:


代码结构:

  1. Test02 类

    • 这是主类,包含 main 方法,用于测试反射相关的操作。

  2. Persons 类

    • 这是一个父类,包含一个 name 字段和两个构造函数。

  3. Student 类

    • 这是 Persons 的子类,构造函数中初始化 name 为 "学生"

  4. Teacher 类

    • 这是 Persons 的子类,构造函数中初始化 name 为 "老师"


代码逐行解析:

1. 创建对象并打印 name 字段
Persons persons = new Student();
Persons persons1 = new Teacher();
System.out.println("这个人是:" + persons.name);
System.out.println("这个人是:" + persons1.name);
  • 创建了一个 Student 对象和一个 Teacher 对象,分别赋值给 Persons 类型的变量 persons 和 persons1

  • 打印 persons 和 persons1 的 name 字段:

    • persons.name 输出 "学生",因为 Student 的构造函数将 name 初始化为 "学生"

    • persons1.name 输出 "老师",因为 Teacher 的构造函数将 name 初始化为 "老师"

2. 方式一:通过对象的 getClass() 方法获取 Class 对象: 
Class c1 = persons.getClass();
System.out.println("c1的哈希值:" + c1.hashCode());
  • persons.getClass() 返回 persons 对象的运行时类(即 Student 类)的 Class 对象。

  • 打印 c1 的哈希值,这个哈希值是 Student 类的 Class 对象的哈希值。

3. 方式二:通过 Class.forName() 方法获取 Class 对象
Class c2 = Class.forName("com.kuang.reflection.Student");
System.out.println("c1的哈希值:" + c2.hashCode());
  • Class.forName("com.kuang.reflection.Student") 通过类的全限定名加载 Student 类,并返回其 Class 对象。

  • 打印 c2 的哈希值,这个哈希值与 c1 的哈希值相同,因为 c1 和 c2 都是 Student 类的 Class 对象。

4. 方式三:通过类名 .class 获取 Class 对象
Class c3 = Student.class;
System.out.println("c3的哈希值:" + c3.hashCode());
  • Student.class 直接获取 Student 类的 Class 对象。

  • 打印 c3 的哈希值,这个哈希值与 c1 和 c2 的哈希值相同,因为 c1c2 和 c3 都是 Student 类的 Class 对象。

5. 方式四:基本内置类型的包装类都有一个 TYPE 属性: 
Class c4 = Integer.TYPE;
System.out.println("c4的类名:" + c4.getName());
  • Integer.TYPE 返回基本数据类型 int 的 Class 对象。

  • 打印 c4 的类名,输出为 "int"

6. 获取父类类型: 
Class c5 = c1.getSuperclass();
System.out.println("c5的父类类型:" + c5);
  • c1.getSuperclass() 返回 c1(即 Student 类)的父类的 Class 对象。

  • 因为 Student 的父类是 Persons,所以 c5 是 Persons 类的 Class 对象。

  • 打印 c5,输出为 "class com.kuang.reflection.Persons"

相关文章:

JavaSE学习笔记25-反射(reflection)

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09; 是一种强大的机制&#xff0c;允许程序在运行时检查和操作类、方法、字段等信息。通过反射&#xff0c;可以动态地创建对象、调用方法、访问字段&#xff0c;甚至修改私有成员。反射的核心类是 java.lang.re…...

ctf网络安全题库 ctf网络安全大赛答案

此题解仅为部分题解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…...

旋转位置编码(ROPE)详解:从Transformer到现代前沿

旋转位置编码&#xff08;ROPE&#xff09;详解&#xff1a;从Transformer到现代前沿 标签&#xff1a;NLP, Transformer, 位置编码, ROPE, 深度学习, 机器学习 摘要&#xff1a;本文详细介绍了旋转位置编码&#xff08;ROPE&#xff09;在Transformer模型中的应用&#xff0…...

ROS2机器人开发--服务通信与参数通信

服务通信与参数通信 在 ROS 2 中&#xff0c;服务&#xff08;Services&#xff09;通信和参数&#xff08;Parameters&#xff09;通信是两种重要的通信机制。服务是基于请求和响应的双向通信机制。参数用于管理节点的设置&#xff0c;并且参数通信是基于服务通信实现的。 1 …...

安全运维,等保测试常见解决问题。

1. 未配置口令复杂度策略。 # 配置密码安全策略 # vi /etc/pam.d/system-auth # local_users_only 只允许本机用户。 # retry 3 最多重复尝试3次。 # minlen12 最小长度为12个字符。 # dcredit-1 至少需要1个数字字符。 # ucredit-1 至少需要1个大…...

【数据标准】数据标准化是数据治理的基础

导读&#xff1a;数据标准化是数据治理的基石&#xff0c;它通过统一数据格式、编码、命名与语义等&#xff0c;全方位提升数据质量&#xff0c;确保准确性、完整性与一致性&#xff0c;从源头上杜绝错误与冲突。这不仅打破部门及系统间的数据壁垒&#xff0c;极大促进数据共享…...

Java 18~20 新特性

文章目录 一、Java 18 新特性1.1、UTF-8 作为默认字符集&#xff08;JEP 400&#xff09;1.2、简易 Web 服务器&#xff08;JEP 408&#xff09;1.3、代码片段标签 snippet&#xff08;JEP 413&#xff09;1.4、使用方法句柄重新实现反射核心&#xff08;JEP 416&#xff09;1.…...

程序员学商务英语之At the Hotel

Dialogue-3 Room service-Cleaning the Room客房服务-打扫房间 A: Who will do the dishes after dinner tonight? 今晚饭后谁来洗碗&#xff1f; B: It’s your turn. 轮到你了。 Go do the room right now. clean the room去打扫房间。Doing the laundry is the last thi…...

探秘路由表:网络世界的导航地图

一、引言 在当今数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。无论是浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;我们都在与网络进行着频繁的交互。而在这背后&#xff0c;网络中的数据传输就如同现实生活中的快递配送&#xf…...

UniApp SelectorQuery 讲解

一、SelectorQuery简介 在UniApp中&#xff0c;SelectorQuery是一个非常强大的工具&#xff0c;它允许开发者查询节点信息。通过这个API&#xff0c;我们可以获取到页面元素的尺寸、位置、滚动条位置等信息。这在处理动态布局、动画效果或是用户交互时尤为重要。 二、基本使用…...

三数之和:经典问题的多种优化策略

三数之和&#xff1a;经典问题的多种优化策略 大家好&#xff0c;我是Echo_Wish。今天我们来聊一个经典的算法问题——三数之和&#xff08;3Sum&#xff09;。它是许多面试和算法竞赛中常见的问题之一&#xff0c;也常常考察我们对算法优化的理解和技巧。我们不仅要解决问题&…...

Flash-00

下载网站&#xff1a;Flash CC 2015中文版下载-Adobe Flash CC 2015(动画制作软件)免费下载-当快软件园 1-什么是Flash&#xff1f; Flash是一款多媒体设计软件&#xff0c;二维交互式动画设计工具&#xff0c;常用于矢量动画制作 2-Flash的应用领域&#xff1f; 动画制作&a…...

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过FTP客户端软件&#xff0c;连接到FTP服务…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今&#xff0c;像 DeepSeek 这样的人工智能工具正在改变企业的运营方式&#xff0c;优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高&#xff0c;组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…...

HaProxy配置详解

一、haproxy基础配置 官方文档&#xff1a;HAProxy version 2.2.22 - Configuration Manual HAProxy 的配置文件haproxy.cfg由两大部分组成&#xff0c;分别是global和proxies部分。 global&#xff1a;全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 pro…...

PCL 基于FPFH特征的SAC-IA算法

文章目录 一、简介二、PCL中的相关类型二、实现代码三、实现效果参考资料一、简介 该算法的大致过程如下所示: 通过这种随机采样并使用FPFH描述子进行匹配的方式,可以快速找到一个较好的转换矩阵,从而实现两个物体的初始配准。 二、PCL中的相关类型 类型为:pcl::SampleCons…...

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/&#xff0c;登录个人账号&#xff0c;右上角加号…...

独立开发者之PLG 和 SLG 是什么

什么是 PLG 和 SLG PLG&#xff08;产品驱动增长&#xff09;是一种策略&#xff0c;通过产品本身吸引用户并推动客户获取、保留和扩展。例如&#xff0c;提供免费试用或免费模式&#xff0c;让用户直接体验产品价值&#xff0c;如 Slack 和 Dropbox 那样。SLG&#xff08;销售…...

Python 基本语法的详细解释

目录 &#xff08;1&#xff09;注释 &#xff08;2&#xff09;缩进 &#xff08;3&#xff09;变量和数据类型 变量定义 数据类型 &#xff08;4&#xff09;输入和输出 输出&#xff1a;print() 函数 输入&#xff1a;input() 函数 &#xff08;1&#xff09;注释 注…...

腾讯SQL面试题变体实现:最长连续天数与允许1天中断的进阶解法

腾讯SQL面试题变体实现:最长连续天数与允许1天中断的进阶解法 作者:某七年数据开发工程师 | 2025年02月23日 关键词:滑动窗口、容错机制、连续区间优化 一、变体题型需求分析 在原题如何找出连续5天涨幅超过5%的股票基础上,需实现两个扩展场景: 最长连续天数:输出每只股…...

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...

w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板&#xff0c;支持IEEE802.11 b/g/n Wi-Fi&#xff0c;以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器&#xff0c;主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装&#xff0c;PCB板载天线&#xff0c;…...

BGP分解实验·19——BGP选路原则之起源

当用不同的方式为BGP注入路由时&#xff0c;起源代码将标识路由的来源。 &#xff08;在BGP表中&#xff0c;Network为“i”&#xff0c;重分布是“&#xff1f;”&#xff09; 实验拓扑如下&#xff1a; R2上将来自IGP的路由10.3.3.3/32用network指令注入BGP;在R4上将来自I…...

使用ESP-IDF来驱动INMP441全向麦克风

之前的文章我们讲过了I2S。 I2S是什么通信协议&#xff1f;它如何传输音频数据&#xff1f;它和I2C是什么关系&#xff1f;_i2c接口和i2s-CSDN博客文章浏览阅读836次&#xff0c;点赞12次&#xff0c;收藏14次。这个可以参考ADC来理解&#xff0c;我们的ADC也是有左对齐和右对…...

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…...

blender笔记2

一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式&#xff1a;反方&#xff0c;相对于&#xff1a;场景原点&#xff0c;对齐&#xff1a;z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后&#xff0c;物体面有阴影。 数据-&g…...

关于在mac中配置Java系统环境变量

引言 在 macOS 上开发 Java 或 Flutter 应用时&#xff0c;正确配置环境变量是至关重要的。环境变量不仅能让系统找到开发工具的位置&#xff0c;还能简化命令行操作。本文将手把手教你从零开始安装 Java SDK&#xff0c;并详细配置环境变量&#xff0c;涵盖常见问题解决和优化…...

透彻理解:方差、协方差、相关系数、协方差矩阵及其应用

最近看了几篇跨领域特征对齐方面的经典文献&#xff0c;学者们搞了很多花样&#xff0c;如有的提出一阶统计特征对齐&#xff0c;有的提出二阶统计特征对齐&#xff0c;有的学者提出高阶统计特征对齐。 通俗而言&#xff0c;就是在统计特征层面对跨域特征进行对齐&#xff0c;…...

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议&#xff08;ICPQC 2025&#xff09;将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家&#xff0c;共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展&#xff0c;其在信息处…...

jmeter后端监视器的妙用和实现方法

JMeter 的后端监视器&#xff08;Backend Listener&#xff09;是一个强大的工具&#xff0c;可用于收集、存储和分析测试过程中的性能指标。它允许将测试数据发送到外部系统&#xff08;如 InfluxDB、Graphite 等&#xff09;&#xff0c;并借助这些系统的可视化工具&#xff…...

Docker 的安全配置与优化(二)

Docker 安全优化策略 &#xff08;一&#xff09;多阶段构建优化镜像大小 多阶段构建是 Docker 17.05 版本引入的强大功能&#xff0c;它允许在一个 Dockerfile 中定义多个构建阶段&#xff0c;每个阶段都可以使用不同的基础镜像和依赖项&#xff0c;最终只将必要的文件和依赖…...

宝塔扩容——阿里云如何操作

一、创建快照 磁盘快照&#xff0c;将数据备份&#xff0c;防止丢失。 1.登录“阿里云”账号 2.点击“控制台”——“云服务器 ECS” 3.点击“基本信息”下&#xff0c;右下角“系统盘” 4.点击“创建快照” 二、磁盘扩容 1.点击“云盘扩容” 2. 选择自己要扩容的大小 …...

vscode settings(一):全局| 用户设置常用的设置项

参考资料 Visual Studio Code权威指南 by 韩骏 一. 全局设置与用户设置 1.1 Vscode支持两种不同范围的设置 用户设置(User Settings)&#xff1a;这是一个全局范围的设置&#xff0c;会应用到所有的Visual Studio Code实例中。工作区设置(Workspace Settings)&#xff1a;设…...

DeepSeek R1本地+私有云版医疗AI部署开发成功案例技术剖析

1. 引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(AI)在医疗领域的应用正逐渐成为推动医疗行业变革的重要力量。近年来,医疗 AI 取得了显著的进展,从疾病诊断、药物研发到医疗管理等各个环节,AI 技术都展现出了巨大的潜力。它能够处理和分析海量的医疗数据,为…...

CMOS图像传感器——偏振光图像传感器技术

最近,在索尼官网看到了其提到的偏光图像传感器技术Polarsens,感到好奇,查阅了相关资料,总结如下。。。。 一、偏振光 偏振实际上是光的一种基本属性,表述光电场振动的方向。振动方向和光波前进的方向构成的平面叫振动面。大多数的光源,比如太阳,发出非偏振光,这里我们…...

ROS2 中 TF 变换发布与订阅:实现 base_link 和 test_link 实时可视化显示

视频讲解 ROS2 中 TF 变换发布与订阅&#xff1a;实现 base 安装环境依赖 sudo apt-get install ros-humble-tf2-ros ros-humble-tf2-geometry-msgs ros-humble-tf-transformations 创建一个包名为tf_test_pkg的包 ros2 pkg create --build-type ament_python tf_test_pkg -…...

SQLMesh 系列教程9- 宏变量及内置宏变量

SQLMesh 的宏变量是一个强大的工具&#xff0c;能够显著提高 SQL 模型的动态化能力和可维护性。通过合理使用宏变量&#xff0c;可以实现动态时间范围、多环境配置、参数化查询等功能&#xff0c;从而简化数据模型的开发和维护流程。随着数据团队的规模扩大和业务复杂度的增加&…...

逻辑函数的神经网络实现

1.单层感知器实现基本逻辑函数 先给大家抛出一道例题 &#xff08;一&#xff09;种类 a.OR函数 目标&#xff1a;当至少一个输入为1时&#xff0c;输出1&#xff1b;否则输出0。 权重设置&#xff1a; 输入权重&#xff1a;所有 wi1&#xff08;i1,2,...,m&#xff09;。…...

链表-基础训练(二)链表 day14

两两交换链表中的节点 题目示意&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 原先我的思路是图像上的思路&#xff0c;但是我感觉还是很复杂…...

使用大语言模型对接OA系统,实现会议室预定功能

随着人工智能技术的不断进步&#xff0c;越来越多的企业开始借助 AI 助手来提高工作效率&#xff0c;尤其是在日常事务的自动化处理中。比如&#xff0c;在许多公司里&#xff0c;会议室的预定是一个常见且频繁的需求&#xff0c;通常需要员工手动检查空闲时间并做出选择。而通…...

hugging face---transformers包

一、前言 不同于计算机视觉的百花齐放&#xff0c;不同网络适用不同情况&#xff0c;NLP则由Transformer一统天下。transformer是2017年提出的一种基于自注意力机制的神经网络架构&#xff0c;transformers库是hugging face社区创造的一个py库&#xff0c;通过该库可以实现统一…...

1. 自定义组件基础

相关资源&#xff1a; &#x1f4ce;day10 图片素材.zip 1. 自定义组件基础 概念&#xff1a;在ArkUI中由框架直接提供的称为系统组件 -> Column&#xff0c;Button等&#xff0c;由开发者定义的称为自定义组件 作用&#xff1a;自定义组件可以对 UI和业务逻辑进行封装&…...

连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接

文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上&#xff0c;需要使用SQL Server&#xff0c;然后使用jdbc连接sql server突然报错为&#xff1a;SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…...

python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理

目录 问题描述方案 问题描述 调用sse流式接口使用httpx_sse的方式 import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, paramsparam) as event_source:clear_textbox(response_t…...

R 语言科研绘图 --- 散点图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

【语音科学计算器】当前汇率

JSON_MARKER_HORN{“base”:“USD”,“rates”:{“EUR”:0.9758,“JPY”:157.68,“GBP”:0.8190,“CNY”:7.3327,“HKD”:7.7872,“AUD”:1.6260,“CAD”:1.4422,“CHF”:0.9157,“SGD”:1.3714,“KRW”:1473.05,“NZD”:1.7992,“THB”:34.54,“MYR”:4.4930,“PHP”:57.32,“…...

python 进程池的基本使用

Python 进程池&#xff1a;Pool任务调度实现 在现代计算机系统重&#xff0c;处理器核心数量的增加为并行计算提供了强大的硬件基础。Python的 multiprocessing 模块中的进程池&#xff08;Pool&#xff09;机制&#xff0c;为开发者提供了 一个高效且易用的并行处理框架。 通…...

初识XML

初识XML <?xml version"1.0" encoding"utf-8" ?> <!--根标签只能有一个--> <!--第一行永远都是 <?xml version"1.0" encoding"utf-8" ?> 前面不允许出现任何其他东西&#xff0c;空格换行等均不行 --> &…...

VisActor/VTable - 快速搭建表格

VTable源于VisActor体系&#xff0c;该体系是从字节跳动大量可视化场景沉淀而来&#xff0c;旨在提供面向叙事的智能可视化解决方案。VisActor包括渲染引擎、可视化语法、数据分析组件、图表组件、表格组件、GIS组件、图可视化组件、智能组件等多个模块&#xff0c;以及周边生态…...