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

Java 反射 (Reflection) 详解

一、什么是 Java 反射?

Java 反射 (Reflection) 是 Java 语言的一个强大特性,它允许 在运行时 检查和修改类、接口、字段和方法的信息,而不需要在编译时知道这些信息。 换句话说,反射可以让你在程序运行过程中“动态”地获取类的信息并操作类的成员。

核心概念:

  • Class 对象: 每个 Java 类都有一个与之对应的 Class 对象。 Class 对象包含了该类的所有信息,例如类名、包名、父类、接口、字段、方法、构造器等。
  • 运行时类型信息 (RTTI): 反射机制是 Java 运行时类型信息 (Run-Time Type Information) 的一种体现。 RTTI 允许程序在运行时确定对象的类型。
  • 动态性: 反射提供了极强的动态性,允许程序在运行时创建对象、调用方法、访问字段,而不需要在编译时知道这些信息。

二、反射的原理

Java 反射的实现依赖于 JVM 的类加载机制和 Class 对象。

  1. 类加载:

    • 当 JVM 启动时,或者当程序第一次使用某个类时,JVM 会将该类的字节码加载到内存中,并创建一个对应的 Class 对象。
    • Class 对象存储了该类的所有信息,包括类的结构、成员变量、方法等。
    • 类加载过程包括加载、验证、准备、解析和初始化等阶段。
  2. Class 对象:

    • java.lang.Class 类是反射机制的核心。 每个 Java 类都有一个 Class 对象,可以通过以下方式获取 Class 对象:
      • Class.forName("类名"): 根据类名获取 Class 对象。
      • 对象.getClass(): 根据对象获取 Class 对象。
      • 类名.class: 直接获取 Class 对象。
    • Class 对象提供了以下方法来获取类的各种信息:
      • getName(): 获取类的完全限定名。
      • getSimpleName(): 获取类的简单名称。
      • getPackage(): 获取类所在的包。
      • getSuperclass(): 获取类的父类。
      • getInterfaces(): 获取类实现的接口。
      • getFields(): 获取类的所有公共字段。
      • getDeclaredFields(): 获取类的所有字段(包括私有字段)。
      • getMethods(): 获取类的所有公共方法。
      • getDeclaredMethods(): 获取类的所有方法(包括私有方法)。
      • getConstructors(): 获取类的所有公共构造器。
      • getDeclaredConstructors(): 获取类的所有构造器(包括私有构造器)。
  3. 反射操作:

    • 通过 Class 对象,可以进行以下反射操作:
      • 创建对象: 使用 newInstance() 方法或 Constructor 对象的 newInstance() 方法来创建对象。
      • 访问字段: 使用 Field 对象的 get()set() 方法来访问字段的值。
      • 调用方法: 使用 Method 对象的 invoke() 方法来调用方法。

三、反射的使用方法

  1. 获取 Class 对象:

    // 1. 通过 Class.forName() 方法
    try {Class<?> clazz = Class.forName("com.example.MyClass");
    } catch (ClassNotFoundException e) {e.printStackTrace();
    }// 2. 通过 对象.getClass() 方法
    MyClass obj = new MyClass();
    Class<?> clazz = obj.getClass();// 3. 通过 类名.class 方式
    Class<?> clazz = MyClass.class;
    
  2. 创建对象:

    try {// 1. 使用 Class 对象的 newInstance() 方法Class<?> clazz = Class.forName("com.example.MyClass");MyClass obj = (MyClass) clazz.newInstance(); // 需要无参构造器// 2. 使用 Constructor 对象的 newInstance() 方法Constructor<?> constructor = clazz.getConstructor(String.class, int.class); // 获取指定参数类型的构造器MyClass obj2 = (MyClass) constructor.newInstance("Hello", 123);
    } catch (Exception e) {e.printStackTrace();
    }
    
  3. 访问字段:

    try {Class<?> clazz = Class.forName("com.example.MyClass");MyClass obj = (MyClass) clazz.newInstance();// 1. 获取公共字段Field field = clazz.getField("publicField");field.set(obj, "New Value"); // 设置字段的值String value = (String) field.get(obj); // 获取字段的值// 2. 获取私有字段Field privateField = clazz.getDeclaredField("privateField");privateField.setAccessible(true); // 设置访问权限privateField.set(obj, 456); // 设置字段的值int privateValue = (int) privateField.get(obj); // 获取字段的值} catch (Exception e) {e.printStackTrace();
    }
    
  4. 调用方法:

    try {Class<?> clazz = Class.forName("com.example.MyClass");MyClass obj = (MyClass) clazz.newInstance();// 1. 获取公共方法Method method = clazz.getMethod("publicMethod", String.class); // 获取指定参数类型的方法String result = (String) method.invoke(obj, "World"); // 调用方法// 2. 获取私有方法Method privateMethod = clazz.getDeclaredMethod("privateMethod", int.class);privateMethod.setAccessible(true); // 设置访问权限int privateResult = (int) privateMethod.invoke(obj, 789); // 调用方法} catch (Exception e) {e.printStackTrace();
    }
    

四、反射的高级应用

  1. 动态代理 (Dynamic Proxy):

    • 动态代理是一种在运行时创建代理对象的机制。 它可以让你在不修改原始类代码的情况下,对方法进行增强或拦截。
    • Java 提供了 java.lang.reflect.Proxy 类来实现动态代理。
  2. 框架开发:

    • 许多 Java 框架(例如 Spring、Hibernate、MyBatis)都广泛使用了反射机制。 反射可以帮助框架在运行时动态地加载类、创建对象、调用方法,从而实现高度的灵活性和可扩展性。
  3. 单元测试:

    • 反射可以用来访问类的私有成员,方便进行单元测试。
  4. 序列化和反序列化:

    • 反射可以用来访问对象的内部状态,实现自定义的序列化和反序列化逻辑。

五、反射的优缺点

优点:

  • 动态性: 可以在运行时获取类的信息并操作类的成员,非常灵活。
  • 可扩展性: 可以在不修改原始类代码的情况下,对程序进行扩展。
  • 通用性: 可以访问任何类的成员,包括私有成员。

缺点:

  • 性能损耗: 反射操作的性能比直接调用代码要低,因为需要进行额外的类型检查和安全检查。
  • 安全问题: 反射可以访问类的私有成员,可能会破坏类的封装性,导致安全问题。
  • 可维护性降低: 反射代码的可读性和可维护性较差,容易出错。

六、最佳实践

  • 谨慎使用反射: 只有在确实需要动态性
    好的,让我们继续深入探讨 Java 反射,包括更多细节、安全性考虑、性能优化建议以及一些高级用例。

七、安全性考虑

反射虽然强大,但使用不当会带来安全风险。 必须谨慎处理以下几点:

  1. 访问控制:
    • 反射可以访问类的私有成员。 为了防止恶意代码利用反射访问敏感信息,需要进行严格的访问控制。
    • setAccessible(true) 方法可以取消 Java 语言的访问控制检查。 在使用 setAccessible(true) 方法时,要确保只在必要的情况下使用,并进行充分的安全审查。
  2. 权限管理:
    • Java 安全管理器 (SecurityManager) 可以用来限制反射操作的权限。 可以通过配置安全策略,禁止某些类或代码执行反射操作。
  3. 输入验证:
    • 在使用反射创建对象或调用方法时,要对输入参数进行严格的验证,防止恶意代码通过构造恶意参数来执行非法操作。
  4. 避免在公共 API 中暴露反射:
    • 尽量避免在公共 API 中暴露反射操作,以防止未经授权的访问。
  5. 模块化 (Java 9+):
    • Java 9 引入了模块系统,可以更精细地控制哪些类可以被反射访问。 模块可以声明哪些包是 “open” 的,允许其他模块反射访问其内部类型。

八、性能优化建议

反射操作的性能比直接调用代码要低,因此需要采取一些措施来优化反射的性能:

  1. 缓存反射结果:
    • 反射操作(例如,获取 Class 对象、Field 对象、Method 对象)的开销较大。 为了避免重复执行反射操作,可以将反射结果缓存起来,例如使用 Map 缓存 Class 对象、Field 对象和 Method 对象。
  2. 使用 setAccessible(true) 前后进行安全检查:
    • setAccessible(true) 操作会禁用安全检查,提高反射效率,但也会降低安全性。 因此,只在必要的时候使用 setAccessible(true),并在使用前后进行安全检查。
  3. 避免频繁调用 newInstance() 方法:
    • newInstance() 方法会调用类的构造器来创建对象,开销较大。 如果需要频繁创建对象,可以考虑使用对象池或工厂模式来减少 newInstance() 方法的调用次数。
  4. 选择合适的反射 API:
    • getMethods() 方法会返回类及其父类中所有公共方法,而 getDeclaredMethods() 方法只会返回类自身声明的方法。 如果只需要访问类自身声明的方法,应该使用 getDeclaredMethods() 方法,以提高性能。
  5. 利用 MethodHandle (Java 7+):
    • MethodHandlejava.lang.invoke 包的一部分,提供了一种更灵活、更高效的方式来调用方法,通常比反射的 Method.invoke() 更快。 它可以看作是反射的一种替代方案,在某些场景下可以提升性能。
  6. JVM 优化: 现代 JVM 针对反射操作进行了一些优化,例如方法内联和即时编译 (JIT)。 确保你使用的 JVM 是最新版本,并开启 JIT 编译。

九、高级用例

  1. 依赖注入 (Dependency Injection, DI):

    依赖注入是一种设计模式,用于降低组件之间的耦合度。 反射可以用来实现依赖注入,在运行时动态地将依赖对象注入到目标对象中。 Spring 框架就是依赖注入的典型应用。

    public class MyService {@Autowiredprivate MyRepository repository;public void doSomething() {repository.saveData("Hello");}
    }// 使用反射实现依赖注入
    public class DIContainer {public static void inject(Object obj) throws Exception {Class<?> clazz = obj.getClass();for (Field field : clazz.getDeclaredFields()) {if (field.isAnnotationPresent(Autowired.class)) {field.setAccessible(true);Class<?> fieldType = field.getType();Object dependency = fieldType.newInstance(); // 创建依赖对象field.set(obj, dependency); // 注入依赖对象}}}
    }
    
  2. ORM (Object-Relational Mapping):

    ORM 框架(例如 Hibernate、MyBatis)可以将 Java 对象映射到数据库表。 反射可以用来获取类的属性信息,动态生成 SQL 语句,并将查询结果映射到 Java 对象。

  3. 动态脚本执行:

    可以使用反射来加载和执行动态脚本,例如 Groovy、JavaScript 等。 这可以实现高度的灵活性和可扩展性。

  4. 注解处理:

    反射可以用来读取类、方法和字段上的注解信息,并根据注解信息执行相应的操作。 例如,可以使用反射来实现自定义的验证框架、配置框架等。

十、实际代码示例:利用反射实现对象复制

下面是一个利用反射实现对象复制的例子,注意这个方法需要处理各种异常,并且只复制简单类型的字段:

import java.lang.reflect.Field;public class ObjectCopier {public static <T> T copy(T obj) {if (obj == null) {return null;}Class<?> clazz = obj.getClass();try {T newObj = (T) clazz.newInstance(); // 创建新对象for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true); // 允许访问私有字段Object value = field.get(obj); // 获取原对象字段的值field.set(newObj, value); // 设置新对象字段的值}return newObj;} catch (Exception e) {e.printStackTrace();return null; // 复制失败}}public static void main(String[] args) {MyClass obj1 = new MyClass("Original", 10);MyClass obj2 = ObjectCopier.copy(obj1);System.out.println("Original Object: " + obj1);System.out.println("Copied Object: " + obj2);obj2.setPublicField("Modified");obj2.setPrivateField(20);System.out.println("Original Object after modification: " + obj1); // 原对象没有被修改System.out.println("Copied Object after modification: " + obj2);}
}class MyClass {public String publicField;private int privateField;public MyClass() {}public MyClass(String publicField, int privateField) {this.publicField = publicField;this.privateField = privateField;}public String getPublicField() {return publicField;}public void setPublicField(String publicField) {this.publicField = publicField;}public int getPrivateField() {return privateField;}public void setPrivateField(int privateField) {this.privateField = privateField;}@Overridepublic String toString() {return "MyClass{" +"publicField='" + publicField + '\'' +", privateField=" + privateField +'}';}
}

十一、总结

Java 反射是一种强大的语言特性,它为我们提供了在运行时动态地获取类信息和操作类成员的能力。 然而,反射也存在一些缺点,例如性能损耗和安全风险。 在使用反射时,需要谨慎权衡其优缺点,并采取相应的措施来提高性能和保证安全。

相关文章:

Java 反射 (Reflection) 详解

一、什么是 Java 反射&#xff1f; Java 反射 (Reflection) 是 Java 语言的一个强大特性&#xff0c;它允许 在运行时 检查和修改类、接口、字段和方法的信息&#xff0c;而不需要在编译时知道这些信息。 换句话说&#xff0c;反射可以让你在程序运行过程中“动态”地获取类的…...

MicroPython使用ESP32和acs712模块测量电流

我们在做物联网应用时&#xff0c;电流检测是监控设备能耗、优化电源管理的重要手段&#xff0c;本文介绍如何利用MicroPython开发ESP32与ACS712霍尔电流传感器模块&#xff0c;实现高精度电流测量&#xff0c;并提供硬件连接、代码实现及校准方法&#xff0c;适用于智能家居、…...

Rust编程语言入门教程 (七)函数与控制流

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…...

pdf预览在vue项目中的使用兼容ie浏览器

一、下载pdf预览插件 链接: https://pan.baidu.com/s/1wuzay-saAfiqtS-efd-cvw?pwd6m78 提取码: 6m78 二、创建一个pdf文件夹&#xff0c;将下载下来的文件build和web文件夹复制到pdf文件夹下 三、项目中使用 (路径由两部分组成&#xff0c;第一部分是项目存放pdf插件的路径…...

二级指针略解【C语言】

以int** a为例 1.二级指针的声明 a 是一个指向 int*&#xff08;指向整型的指针&#xff09;的指针&#xff0c;即二级指针。 通俗的讲&#xff0c;a是一个指向指针的指针&#xff0c;对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...

前端基础入门:HTML、CSS 和 JavaScript

在现代网页开发中,前端技术扮演着至关重要的角色。无论是个人网站、企业官网,还是复杂的 Web 应用程序,前端开发的基础技术 HTML、CSS 和 JavaScript 都是每个开发者必须掌握的核心技能。本文将详细介绍这三者的基本概念及其应用 一、HTML——网页的骨架 HTML(HyperText …...

测试 FreeSWITCH 的 sip_invite_route_uri

bgapi originate sofia/external/123461.132.230.73:5161 &echo 得到的是&#xff1a; 172.17.129.123:5088 -> 61.132.230.73:5161 INVITE sip:123461.132.230.73:5161 SIP/2.0 Via: SIP/2.0/UDP 8.141.11.8:5088;rport;branchz9hG4bKcagQFyUgF21NS Max-Forwards: 70 …...

网络安全中的机器学习

当涉及到网络安全时&#xff0c;技术一直是保护系统免受攻击和数据泄露的关键。在这篇论文中&#xff0c;我将介绍一些当前在网络安全领域使用的关键技术&#xff0c;包括加密&#xff0c;身份验证和防火墙。 首先&#xff0c;加密是网络安全中最常见的技术之一。加密是指使用算…...

Electron通过ffi-napi调用dll导出接口

electron使用ffi-napi环境搭建 附打包好的ffi-napi可以直接放到项目目录下使用&#xff0c;避免以后麻烦 一、安装node.js Node.js官网&#xff1a;https://nodejs.org/zh-cn/download&#xff0c;选择LTS长期稳定版本即可 需要注意Node.js 区分32和64位&#xff0c;32位版…...

使用 DeepSeek + 语音转文字工具 实现会议整理

目录 简述 1. DeepSeek与常用的语音转文字工具 1.1 DeepSeek 1.2 讯飞听见 1.3 飞书妙记 1.4 剪映电脑版 1.5 Buzz 2. 安装Buzz 3. 使用DeepSeek Buzz提取并整理语音文字 3.1 使用 Buzz 完成语音转文字工作 3.2 使用 DeepSeek 进行文本处理工作 3.3 整理成思维导图…...

RAGFLOW使用flask转发的open ai接口

flask转发openai标准接口 背景 搭建RAGFLOW 的过程中&#xff0c;遇到一个比较严重的问题&#xff0c;公司部署的大模型代理需要获取token&#xff0c;且token存在有效期5分钟&#xff0c;在RAGFLOW中不能直接用&#xff0c;所以希望通过flask项目转发请求。 方案 比较好的…...

语音芯片非隔离电源供电WT5104

语音芯片非隔离电源供电WT5104 语音芯片供电非隔离电源芯片 WT5104 介绍 在语音相关设备的运行中&#xff0c;稳定的电源供应是确保语音芯片正常工作、实现高质量语音交互的关键。WT5104 作为一款专为多种设备供电设计的非隔离电源芯片&#xff0c;能将常见的 220V 交流电高效转…...

P8752 [蓝桥杯 2021 省 B2] 特殊年份——string提取索引转换为值

这里写目录标题 链接题目代码大佬解答string提取索引转换为值 链接 P8752 [蓝桥杯 2021 省 B2] 特殊年份 题目 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <queue&g…...

玩机日记 12 群晖部署AList并配置SSL,安装opkg,使用rclone挂载到本地

目录 1、部署alist&#xff0c;配置ssl 安装alist 参考官方文档添加网盘 配置ssl 开启webdav访问 2、安装opkg 修改环境变量 添加计划任务 3、安装配置rclone挂载alist 安装rclone&#xff0c;新建remote 安装fuse3 挂载AList 添加计划任务 1、部署alist&#xff0…...

Fastgpt学习(5)- FastGPT 私有化部署问题解决

1.☺ 问题描述&#xff1a; Windows系统&#xff0c;本地私有化部署&#xff0c;postgresql数据库镜像日志持续报错" data directory “/var/lib/postgresql/data” has invalid permissions "&#xff0c;“ DETAIL: Permissions should be urwx (0700) or urwx,gr…...

我们来学nginx -- work process

题记 回看困惑工作进程能处理大量的并发请求几乎不会阻塞Worker进程可绑定到固定的核&#xff0c;避免CPU频繁地上下文切换看样子&#xff0c;还得转为人话 大白话 作为一般的应用的开发大部分人没有很强的底层技术基础如果深究&#xff0c;涉及复杂技术点&#xff0c;很容易…...

2000-2019年各省农业机械总动力数据

2000-2019年各省农业机械总动力数据 1、时间&#xff1a;2000-2019年 2、指标&#xff1a;行政区划代码、地区、年份、农业机械总动力(万千瓦) 3、范围&#xff1a;31省 4、来源&#xff1a;国家统计局、统计年鉴 5、指标解释&#xff1a;‌农业机械总动力‌是指主要用于农…...

Nginx 常用命令和部署详解及案例示范

一、Nginx常用命令 1.1 启动 Nginx 要启动 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重启 Nginx 在修改了 Nginx…...

从零开始用STM32驱动DRV8301:无人机/机器人电机控制指南

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、为什么需要专业电机驱动&#xff1f;二、硬件架构深度解析2.1 STM32微控制器核心作用2.2 DRV8301三大核心功能功能…...

HTML5 面试题

1. HTML5 新增了哪些重要特性&#xff1f; 语义化标签&#xff1a;这些标签有助于提高页面的可读性和可维护性。多媒体支持&#xff1a;HTML5 引入了 和 标签&#xff0c;可以直接嵌入音频和视频文件&#xff0c;无需依赖插件。本地存储&#xff1a;引入了 localStorage 和 se…...

获取指定的python库安装路径

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; ---------------------------------------…...

C语言预处理学习笔记

1. 预处理器的功能 预处理器&#xff08;Preprocessor&#xff09;在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头&#xff0c;主要包括文件包含、宏定义、条件编译等功能。 2. 文件包含 文件包含功能用于在一个文件中包含另一个文件的内容&#xff0c;通常用…...

动态内存分配算法对比:最先适应、最优适应、最坏适应与邻近适应

动态内存分配算法对比&#xff1a;最先适应、最优适应、最坏适应与邻近适应 在操作系统中&#xff0c;动态内存分配算法用于管理空闲内存块的分配和回收。最先适应算法&#xff08;First Fit&#xff09;、最优适应算法&#xff08;Best Fit&#xff09;和最坏适应算法&#x…...

Flutter 常见布局模型

Flutter的常见的布局模型有容器&#xff08;Container&#xff09;、弹性盒子布局&#xff08;Flex、Row、Column、Expanded&#xff09;、流式布局&#xff08;Wrap、Flow&#xff09;、层叠布局&#xff08;Stack、Position&#xff09;、滚动布局&#xff08;ListView、Grid…...

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…...

文献阅读 250220-Convective potential and fuel availability complement near-surface

Convective potential and fuel availability complement near-surface weather in regulating global wildfire activity 来自 <https://www.science.org/doi/10.1126/sciadv.adp7765> ## Abstract: 炎热、干燥、多风、无雨的条件有利于野火——这种关于火灾天气的知识为…...

ASP.NET JWT认证失败响应:从默认到自定义的优雅改造

本文主要介绍如何通过ASP.NET Core的JwtBearerEvents机制&#xff0c;实现JWT认证失败响应的深度定制。 1. 背景 在之前的文章《一个简单的ASP.NET一致性返回工具库》 中&#xff0c;我们介绍了 Sang.AspNetCore.CommonLibraries 这一通用库&#xff0c;它通过统一API响应模型…...

AI大模型生成Logo图形商标,快速可选性强!

在申请注册商标时&#xff0c;不仅有文字商标&#xff0c;还有图形商标&#xff0c;及文字和图形的组合商标&#xff0c;如何更好的实现快速出图和对图形描述的要求&#xff0c;普推知产商标老杨近期也是研究测试了各种大模型。 最后选了AI模型本地部署及API接入生成图形商标的…...

Python爬虫实战:爬取豆瓣电影

目录 引言 1. 爬虫基础 1.1 什么是爬虫&#xff1f; 1.2 Python爬虫常用库 2. 实战&#xff1a;抓取豆瓣电影Top250 2.1 安装依赖库 2.2 发送HTTP请求 ​编辑 2.3 解析HTML ​编辑 2.4 存储数据 2.5 完整代码 3. 进阶&#xff1a;处理分页和动态内容 3.1 抓取多页…...

嵌入式0xDEADBEEF

在嵌入式系统中&#xff0c;0xDEADBEEF 是一个常见的“魔数”&#xff08;magic number&#xff09;&#xff0c;通常用于调试和内存管理。它的含义和用途如下&#xff1a; 1. 调试用途 未初始化内存的标记&#xff1a;在调试时&#xff0c;0xDEADBEEF 常用于标记未初始化或已…...

python入门笔记5-集合与字典

元组 Python 的元组&#xff08;tuple&#xff0c;简写为tup&#xff09;与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号​()​&#xff0c;列表使用方括号​[]​。 好处就是节省内存。 集合 集合是无序、不重复元素的容器。 用 {} 或 set() 创建…...

Nginx(详解以及如何使用)

目录 1. 什么是Nginx&#xff1f; 2. 为什么使用nginx? 3. 安装nginx 3.1?安装nginx的依赖插件 3.2 下载nginx ?3.3?创建一个目录作为nginx的安装路径 ?3.4?解压 ?3.5?进入解压后的目录 3.6?指定nginx的安装路径 ?3.7?编译和安装nginx 3.8 启动nginx ?…...

java每日精进 2.20 MQ相关复健

在 RabbitMQ 中&#xff0c;消息消费者对消息的签收&#xff08;acknowledgment&#xff09;可以通过三种方式进行管理&#xff1a;自动签收、手动签收 和 拒绝签收。它们主要控制消费者如何处理消息确认和消息的重新排队。下面详细讲解它们的区别&#xff0c;并通过代码示例展…...

微信小程序地图map全方位解析

微信小程序地图map全方位解析 微信小程序的 <map> 组件是一个功能强大的工具&#xff0c;可以实现地图展示、定位、标注、路径规划等多种功能。以下是全方位解析微信小程序地图组件的知识点&#xff1a; 一、地图组件基础 1. 引入 <map> 组件 在页面的 .wxml 文…...

Windows隐藏窗口/开机自启动

目录 使用Start-Process命令控制窗口状态 设置程序开机自启动 使用Start-Process命令控制窗口状态 隐藏窗口运行程序 使用Start-Process命令时&#xff0c;可以通过-WindowStyle Hidden参数让程序在后台运行&#xff0c;窗口不可见。例如&#xff1a; Start-Process D:\note…...

量子计算的威胁,以及企业可以采取的措施

当谷歌、IBM、Honeywell和微软等科技巨头纷纷投身量子计算领域时&#xff0c;一场技术军备竞赛已然拉开帷幕。 量子计算虽能为全球数字经济带来巨大价值&#xff0c;但也有可能对相互关联的系统、设备和数据造成损害。这一潜在影响在全球网络安全领域引起了强烈关注。也正因如…...

日期类(完全讲解版)

1. 类的设计思想 Date 类的设计目的是为了封装和处理日期信息&#xff0c;它提供了对日期的基本操作&#xff0c;如日期加减、日期比较、日期合法性检查等。类中的私有成员 int _year, int _month, int _day 存储了日期的年、月、日。 类的声明和构造 Date 类的声明&#xff1…...

在线考试系统的公平性和高效性如何保证

随着互联网技术的飞速发展&#xff0c;线上教育已成为现代教育体系中的重要组成部分。而在线考试系统作为线上教育的重要环节&#xff0c;其公平性和高效性成为了广大教育工作者和考生关注的焦点。本文将深入探讨在线考试系统如何保证考试的公平性和高效性&#xff0c;以期为线…...

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型&#xff0c;凭借其强大的自然语言处理能力和丰富的知识储备&#xff0c;迅速成为业界关注的焦点。无论是文本生…...

基于spring的策略模式

集合spring框架的是策略模式&#xff0c;直接上代码 1、接口 public interface PaymentStrategy {//支付接口void pay(double amount);}2、实现类 2.1 实现类一 Component("creditCard") //作为区分的标识 public class CreditCardPayment implements PaymentStr…...

面试编程题

1. 请写出string类的定义&#xff0c;要求有构造函数&#xff0c;析构函数&#xff0c;拷贝&#xff0c;赋值函数。 #include <cstring> #include <algorithm>class String { public:explicit String(const char* str nullptr){if(str){str_ new char[strlen(st…...

AI工具讲解

推荐超级课程&#xff1a; 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录 模型管理OllamaHugging Face区别 AI模型交互应用程序AnythingLLMCherry Studio AI开发相关Python库 模型管理 Ollama h…...

计算机网络:应用层 —— 动态主机配置协议 DHCP

文章目录 什么是 DHCP&#xff1f;DHCP 的产生背景DHCP 的工作过程工作流程地址分配机制 DHCP 中继代理总结 什么是 DHCP&#xff1f; 动态主机配置协议&#xff08;DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于自动分…...

基于Spring Boot,结合Redis缓存和RabbitMQ消息队列的站内信系统设计

1. 添加依赖 在pom.xml中添加必要的依赖&#xff1a; <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependen…...

【JAVA:list中再定义一个list对象,循环赋值不同的list数据,出现追加重复数据问题】

问题描述&#xff1a; list中再定义一个list对象&#xff0c;循环赋值不同的list数据&#xff0c;结果全部都累加到每条数据中了&#xff0c;每条数据中都出现重复数据。 问题解决&#xff1a; 1.创建树结构方法信息 2.创建一个新的 List 对象&#xff0c;避免引用问题 3.使…...

系统思考—价格策略

“我们之所以犯错&#xff0c;是因为我们没有意识到自己处在错误的思维模式中。” —— 卡尔波普尔&#xff08;哲学家&#xff0c;批判理性主义的创始人&#xff09; 最近和小伙伴们聊到定价这个变量&#xff0c;深刻感受到系统思考的强大力量。记得在MIT经典沙盘《人民航空经…...

提升信息检索准确性和效率的搜索技巧

一、基础技巧 精准关键词 避免长句子&#xff0c;提取核心关键词&#xff08;如用“光合作用 步骤”代替“请告诉我光合作用的具体过程”&#xff09;。 同义词替换&#xff1a;尝试不同表达&#xff08;如“AI 发展史” vs “人工智能 历史”&#xff09;。 排除干扰词 使用…...

第3章:在LangChain中如何设置模型参数

本章主要介绍了如何在LangChain4j中配置和调整模型参数&#xff0c;以满足不同的需求和优化模型的表现&#xff1b; 在Java开发框架中通过LangChain4j调用LLM&#xff0c;可以如何设置模型参数&#xff0c;以及对应参数的详细说明&#xff0c;如此以来你可以掌握在智能体开发过…...

java | MyBatis-plus映射和golang映射对比

文章目录 Java实体类和数据库的映射1.默认驼峰命名规则2.自定义字段映射3.关闭驼峰命名规则4.JSON序列化映射 Golang1. 结构体与表的映射2. 字段与列的映射3. 关联关系映射4. 其他映射相关标签 这篇也是做数据库映射方面的对比&#xff1a; Java 实体类和数据库的映射 1.默认…...

CMDB与ITIL的关系:如何通过CMDB实现IT服务管理?

在数字化转型的浪潮中&#xff0c;企业IT系统的复杂性呈指数级增长。如何高效管理海量IT资源、快速响应业务需求&#xff0c;成为每个企业必须面对的挑战。而CMDB&#xff08;配置管理数据库&#xff09;和ITIL&#xff08;信息技术基础设施库&#xff09;的结合&#xff0c;正…...