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

Spring反射机制

Spring反射机制

反射机制是加载类时,在运行时动态地获取类的信息,并且可以操作类或对象的属性、方法、构造函数等成员的能力。在 Java 里,反射机制的实现主要依赖于 java.lang.reflect 包下的多个类,以及 java.lang 包中的 Class 类。

反射的机制的应用场景

类:

  • 获取class对象

  • 获取构造器

  • 获取成员变量

  • 获取成员方法

基本的作用:
得到一个类的全部作用,然后实现操作,主要是框架的开发领域

获取class对象的方法:

// 方式一:通过类名的 .class 属性
Class<?> stringClass = String.class;// 方式二:通过对象的 getClass() 方法
String sampleStr = "example";
Class<?> anotherStringClass = sampleStr.getClass();// 方式三:通过全限定类名的静态方法 forName()
try {Class<?> yetAnotherStringClass = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {e.printStackTrace();
}

获取类构造器的常见方法:

1,获取所有公共构造器
使用 Class 类的 getConstructors() 方法能获取类的所有公共构造器。该方法返回一个 Constructor 数组,包含类中所有声明为 public 的构造函数。import java.lang.reflect.Constructor;public class GetPublicConstructors {public static void main(String[] args) {try {Class<?> clazz = java.util.ArrayList.class;Constructor<?>[] constructors = clazz.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}} catch (Exception e) {e.printStackTrace();}}
}2. 获取指定参数类型的公共构造器
使用 Class 类的 getConstructor(Class<?>... parameterTypes) 方法可以获取指定参数类型的公共构造器。如果找不到匹配的构造器,会抛出 NoSuchMethodException 异常。
import java.lang.reflect.Constructor;
import java.util.ArrayList;public class GetSpecificPublicConstructor {public static void main(String[] args) {try {Class<?> clazz = ArrayList.class;// 获取接收一个 int 类型参数的公共构造器Constructor<?> constructor = clazz.getConstructor(int.class);System.out.println(constructor);} catch (NoSuchMethodException e) {e.printStackTrace();}}
}3,获取所有构造器(包含私有、受保护和默认构造器)
使用 Class 类的 getDeclaredConstructors() 方法可获取类的所有构造器,无论其访问修饰符是什么。该方法返回一个 Constructor 数组,包含类中所有构造函数。
import java.lang.reflect.Constructor;class SampleClass {private SampleClass() {}protected SampleClass(int value) {}public SampleClass(String str) {}
}public class GetAllConstructors {public static void main(String[] args) {Class<?> clazz = SampleClass.class;Constructor<?>[] constructors = clazz.getDeclaredConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}}
}4,获取指定参数类型的构造器(包含私有、受保护和默认构造器)
使用 Class 类的 getDeclaredConstructor(Class<?>... parameterTypes) 方法可以获取指定参数类型的构造器,不论其访问修饰符。若找不到匹配的构造器,会抛出 NoSuchMethodException 异常import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;class PrivateConstructorClass {private PrivateConstructorClass(int num) {}
}public class GetSpecificDeclaredConstructor {public static void main(String[] args) {try {Class<?> clazz = PrivateConstructorClass.class;// 获取接收一个 int 类型参数的构造器Constructor<?> constructor = clazz.getDeclaredConstructor(int.class);// 设置可访问私有构造器,实现暴力访问,禁止检查访问权限/*对于私有构造器,调用前需要使用 setAccessible(true) 来突破访问限制。同时,在使用这些方法时,要注意处理可能出现的异常。*/constructor.setAccessible(true);// 使用构造器创建对象Object obj = constructor.newInstance(10);System.out.println(obj);} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}
}
获取所有的成员变量
获取所有公共成员变量
使用 Class 类的 getFields() 方法可以获取类及其所有父类的公共成员变量。该方法返回一个 Field 数组,包含所有公共成员变量。
import java.lang.reflect.Field;class ParentClass {public int publicParentField = 1;
}class ChildClass extends ParentClass {public String publicChildField = "child";
}public class GetPublicFields {public static void main(String[] args) {Class<?> clazz = ChildClass.class;Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);}}
}
获取指定名称的公共成员变量
获取指定名称的公共成员变量
import java.lang.reflect.Field;class MyClass {public int publicField = 10;
}public class GetSpecificPublicField {public static void main(String[] args) {try {Class<?> clazz = MyClass.class;Field field = clazz.getField("publicField");System.out.println(field);} catch (NoSuchFieldException e) {e.printStackTrace();}}
}
获取所有成员变量(包含私有、受保护和默认成员变量)

使用 Class 类的 getDeclaredFields() 方法可以获取类自身声明的所有成员变量,无论访问修饰符是什么。该方法返回一个 Field 数组,包含所有声明的成员变量,但不包含父类的成员变量。
import java.lang.reflect.Field;class MyClass {private int privateField = 20;protected String protectedField = "protected";String defaultField = "default";public double publicField = 3.14;
}public class GetAllDeclaredFields {public static void main(String[] args) {Class<?> clazz = MyClass.class;Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {System.out.println(field);}}
}
获取指定名称的成员变量(包含私有、受保护和默认成员变量)

使用 Class 类的 getDeclaredField(String name) 方法可以获取指定名称的成员变量,无论其访问修饰符是什么。如果找不到对应的成员变量,会抛出 NoSuchFieldException 异常。

import java.lang.reflect.Field;class MyClass {private int privateField = 20;
}public class GetSpecificDeclaredField {public static void main(String[] args) {try {Class<?> clazz = MyClass.class;Field field = clazz.getDeclaredField("privateField");// 设置可访问私有成员变量field.setAccessible(true);MyClass obj = new MyClass();int value = (int) field.get(obj);System.out.println(value);} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}
}

若只需要获取公共成员变量,可使用 getFields() 和 getField(String name) 方法。
若要获取类自身声明的所有成员变量,可使用 getDeclaredFields() 和 getDeclaredField(String name) 方法。

对于私有成员变量,在访问前需要使用 setAccessible(true) 来突破访问限制。同时,使用这些方法时要注意处理可能出现的异常。

获取类的成员方法

获取 Class 对象:通过 ExampleClass.class 获取 ExampleClass 的 Class 对象。
创建实例:使用 getDeclaredConstructor().newInstance() 创建 ExampleClass 的实例。
获取所有公共方法:使用 getMethods() 方法获取类及其父类的所有公共方法。
获取指定公共方法并调用:使用 getMethod() 方法获取指定名称和参数类型的公共方法,然后使用 invoke() 方法调用该方法。
获取所有声明的方法:使用 getDeclaredMethods() 方法获取类自身声明的所有方法,不考虑访问权限。
获取指定非公共方法并调用:使用 getDeclaredMethod() 方法获取指定名称和参数类型的方法,对于私有方法,需要使用 setAccessible(true) 来突破访问限制,然后使用 invoke() 方法调用该方法。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;// 定义一个示例类
class ExampleClass {// 公共方法public void publicMethod() {System.out.println("This is a public method.");}// 带参数的公共方法public int publicMethodWithParams(int a, int b) {return a + b;}// 私有方法private void privateMethod() {System.out.println("This is a private method.");}// 受保护方法protected void protectedMethod() {System.out.println("This is a protected method.");}// 默认访问权限方法void defaultMethod() {System.out.println("This is a default method.");}
}public class ReflectionMethodExample {public static void main(String[] args) {try {// 获取 ExampleClass 的 Class 对象Class<?> clazz = ExampleClass.class;// 创建 ExampleClass 的实例Object instance = clazz.getDeclaredConstructor().newInstance();// 1. 获取所有公共方法(包括继承自父类的公共方法)System.out.println("所有公共方法:");Method[] publicMethods = clazz.getMethods();for (Method method : publicMethods) {System.out.println(method);}// 2. 获取指定的公共方法并调用System.out.println("\n调用指定的公共方法:");Method publicMethod = clazz.getMethod("publicMethod");publicMethod.invoke(instance);Method publicMethodWithParams = clazz.getMethod("publicMethodWithParams", int.class, int.class);int result = (int) publicMethodWithParams.invoke(instance, 3, 5);System.out.println("公共方法返回结果: " + result);// 3. 获取所有声明的方法(只包含本类声明的方法,不考虑访问权限)System.out.println("\n所有声明的方法:");Method[] declaredMethods = clazz.getDeclaredMethods();for (Method method : declaredMethods) {System.out.println(method);}// 4. 获取指定的私有方法并调用System.out.println("\n调用指定的私有方法:");Method privateMethod = clazz.getDeclaredMethod("privateMethod");// 设置可访问私有方法privateMethod.setAccessible(true);privateMethod.invoke(instance);// 5. 获取指定的受保护方法并调用System.out.println("\n调用指定的受保护方法:");Method protectedMethod = clazz.getDeclaredMethod("protectedMethod");protectedMethod.invoke(instance);// 6. 获取指定的默认访问权限方法并调用System.out.println("\n调用指定的默认访问权限方法:");Method defaultMethod = clazz.getDeclaredMethod("defaultMethod");defaultMethod.invoke(instance);} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}
}

使用反射实现设计一些简单的框架的设计

注解(Annotation)和反射的关系

注解(Annotation)是一种代码级别的元数据,可在类、方法、变量、参数和包等元素上添加,用于为程序提供额外信息。这些信息能在编译时、运行时被读取和处理,发挥多种重要作用,让其它程序根据注解是西安怎么操作程序。

使用 @interface 关键字定义注解
使用 @interface 关键字来创建自定义注解,其语法格式如下:
public @interface 注解名 {// 注解元素定义
}使用元注解配置自定义注解
元注解是用于修饰注解的注解,Java 提供了几种常用的元注解,用于控制自定义注解的作用范围、保留策略等。
@Target:指定注解可以应用的目标元素类型,如类、方法、字段等。
@Retention:指定注解的保留策略,即注解在什么阶段可用,有 SOURCE(仅在源码中保留)、CLASS(在编译后的字节码文件中保留,但运行时不可用)、RUNTIME(在运行时可用,开发时最常见)三种策略。
@Documented:表示该注解会被包含在 JavaDoc 文档中。
@Inherited:表示该注解可以被继承,即如果一个类使用了该注解,那么它的子类也会继承该注解。定义注解元素
注解元素类似于方法,可定义默认值。注解元素的类型只能是基本数据类型、StringClass、枚举类型、注解类型以及这些类型的数组。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 定义注解可以应用于类、方法和字段
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
// 定义注解在运行时可用
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {// 定义注解元素,可设置默认值String value() default "";//特殊属性,只有一个value的时候可以不写int count() default 1;
}// 使用自定义注解
@MyAnnotation(value = "This is a class annotation", count = 3)
class MyClass {@MyAnnotation("This is a field annotation")private String myField;@MyAnnotation(value = "This is a method annotation", count = 5)public void myMethod() {System.out.println("Method is called.");}
}注解的本质是一个接口,所有的注解都继承了Annotation接口。
@注解(...)其实就是一个实现类对象,实现了该注解以及annotation的接口。

注解的解析

在 Java 里,注解本身只是元数据,若要让其发挥作用,就需要对注解进行解析。注解解析主要依靠反射机制,在不同阶段(编译时、运行时)获取注解信息并执行相应逻辑。下面从元注解、注解解析的方式和示例等方面详细介绍注解解析。

注解解析方式

  1. 编译时解析
    编译时解析通常借助注解处理器(Annotation Processor)实现。注解处理器在编译阶段扫描源代码中的注解,依据注解信息生成额外的代码或进行编译时检查。
  2. 运行时解析
    运行时解析通过反射机制获取注解信息,在程序运行时根据注解信息执行相应逻辑。这种方式更为常见,下面重点介绍运行时解析。
    运行时注解解析示例。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;// 定义注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyFieldAnnotation {String value() default "";int order() default 0;
}// 使用注解
class MyClass {@MyFieldAnnotation(value = "姓名", order = 1)private String name;@MyFieldAnnotation(value = "年龄", order = 2)private int age;
}// 解析注解
public class AnnotationParser {public static void main(String[] args) {MyClass myClass = new MyClass();Class<?> clazz = myClass.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(MyFieldAnnotation.class)) {MyFieldAnnotation annotation = field.getAnnotation(MyFieldAnnotation.class);System.out.println("字段名: " + field.getName());System.out.println("注解值: " + annotation.value());System.out.println("排序值: " + annotation.order());System.out.println("----------------------");}}}
}
isAnnotationPresent(Class<? extends Annotation> annotationClass):判断元素(类、方法、字段等)是否存在指定类型的注解。
getAnnotation(Class<T> annotationClass):获取元素上指定类型的注解,如果不存在则返回 nullgetAnnotations():获取元素上的所有注解。
getDeclaredAnnotations():获取元素上直接声明的所有注解,不包含继承的注解。

相关文章:

Spring反射机制

Spring反射机制 反射机制是加载类时&#xff0c;在运行时动态地获取类的信息&#xff0c;并且可以操作类或对象的属性、方法、构造函数等成员的能力。在 Java 里&#xff0c;反射机制的实现主要依赖于 java.lang.reflect 包下的多个类&#xff0c;以及 java.lang 包中的 Class…...

PCB硬件电路设计_pcb布线设计

1.MCU最小系统电路 这些电路都会非常接近MCU&#xff0c;他们的可靠性决定了MCU能否正常工作。 外围电路&#xff0c;为了布线整齐美观&#xff0c;尽量避免打过多的通孔。在布局的时候走线的顺序和元器件顺序尽可能的保持一直避免走线交叉。 2.晶振电路布线 一般情况下我们…...

Qt开发:XML文件的写入与读取

文章目录 一、使用 QDomDocument操作节点1.1 将信息写入XML文件中1.2.从XML文件中读取信息 二、使用 QXmlStreamWriter操作节点2.1 将信息写入XML文件中2.2 从XML文件中读取信息 三、总结 一、使用 QDomDocument操作节点 1.1 将信息写入XML文件中 #include <QDomDocument&…...

PCI/PXI 总线的可编程电阻卡

701X 系列是阿尔泰科技基于 PCI/PXI 总线的可编程电阻卡&#xff0c;多种电阻范围可选&#xff0c;稳定性好&#xff1b;准确 度低至 0.2%&#xff1b;分辨率设置精细&#xff0c;可低至 0.125Ω&#xff0c;适用于传感器仿真应用。 701X 系列高精度程控电阻模块具有高设置分辨…...

火语言RPA--腾讯云存储

【组件功能】&#xff1a;存储本地文件至腾讯云 选择本地文件&#xff0c;通过腾讯云存储配置上传至腾讯云对象存储的指定地域指定存储桶指定路径。 配置预览 配置说明 SecretId 支持T或# 前往官网获取或创建。参考链接&#xff1a;https://console.cloud.tencent.com/cam/…...

使用POI和EasyExcel使用导入

1.使用POI导入 1.1导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency> 1.2创建工具类 package com.ruoyi.common.utils.poi;import org.ap…...

AWS PrivateLink vs Lattice:深度解析两大网络服务的异同

导语: 在AWS的网络服务生态中,PrivateLink和Lattice都是备受关注的解决方案。本文将深入探讨这两项服务的核心特性、应用场景以及它们之间的关键区别,帮助您在复杂的网络架构设计中做出明智的选择。 一、AWS PrivateLink 概述 定义 AWS PrivateLink 是一种网络服务,允许您…...

Linux系统编程---exec簇:进程的加载与替换

1、exec簇基础 在Linux中&#xff0c;用于加载并执行指定程序的API有exec簇和system函数。 exec簇的进程替换不会创建一个新的进程&#xff0c;只是加载新的程序代码和数据&#xff0c;替换当前进程执行的程序代码。 system函数的进程替换是创建一个新的子进程&#xff0c;然后…...

C++ 之 【模拟实现 list(节点、迭代器、常见接口)】(将三个模板放在同一个命名空间就实现 list 啦)

1.前提准备 (1) list 的底层结构一般是带头双向循环链表 (1)为避免命名冲突&#xff0c;需要创建一个命名空间来存放模拟实现的 list (2)下面模拟实现list时&#xff0c;声明和定义不分离(具体原因后续讲解) 2.完整实现 2.1 链表节点 template<class T>//节点写成类模板…...

数字图像处理 -- 眼底图像血管分割方法

算法框架 基于深度学习的 U-Net 架构&#xff0c;结合注意力机制&#xff08;Attention Gate&#xff09;与多尺度特征提取&#xff0c;以提高细小血管的检测能力。整体流程如下&#xff1a; 输入图像预处理&#xff1a;提取绿色通道 & CLAHE 增强数据增强&#xff1a;旋…...

基于ffmpeg的音视频编码

1 音频编码 本质上是由pcm文件转到一个协议文件 比如说aac协议 1.1 音频基本知识回归 比特率 比特率是指单位时间内传输或处理的比特&#xff08;bit&#xff09;数量&#xff0c;通常用 bps&#xff08;bits per second&#xff0c;比特每秒&#xff09;来表示。它是衡量数…...

Android wifi开发调试总结

Android wifi开发调试简单总结 文章目录 Android wifi开发调试简单总结一、前言二、wifi demo开发1、开关和连接2、wifi开启主要流程3 、wifi主要广播4、相关日志5、demo示例 三、其他1、Wifi开发小结2、其他wifi知识小结&#xff08;1&#xff09;Android无线Wifi开发&#xf…...

LLVIP、KAIST、M3FD数据集

LLVIP、KAIST、M3FD数据集 &#xff08;可见光红外&#xff0c;双模态数据集&#xff0c;已配准已对齐已清洗&#xff0c;已处理为txt格式&#xff0c;YOLO可直接训练&#xff09; 电子产品&#xff0c;一经出售&#xff0c;概不退换 算法设计、毕业设计、期刊专利&#xff01;…...

datasets 数据处理封装后,统一处理流程以避免Dataset Map顺序依赖问题

文章目录 处理流程说明小结 在实际项目中&#xff0c;我们常常需要对数据集进行预处理。为了规范操作&#xff0c;我封装了一个基础数据集处理类&#xff1a; class DatasetAbstract:"""所有数据集都应包含以下几个字段&#xff1a;* question&#xff1a;用户…...

【学习笔记】机器学习(Machine Learning) | 第四章(3)| 多变量线性回归

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 三、特征工程与多项式回归&#xff08;一&#xff09;特征工程&#xff1a;从数据中发…...

将本地Springboot项目部署到Linux服务器

1、打包后端项目 在IDEA的终端上执行命令 mvn clean package "-Dmaven.test.skiptrue" 在target目录下查看jar包是否存在 2、idea运行jar包&#xff08;可选&#xff09; 在IDEA的终端上执行命令 # 进入jar包所在目录 E:\LzpWorkspaces\lzp-records> cd .\tar…...

无人设备遥控器之实时数据保护技术篇

无人设备遥控器的实时数据保护技术是保障设备安全运行、避免信息泄露或恶意干扰的核心手段&#xff0c;其核心目标是在复杂电磁环境和网络攻击威胁下&#xff0c;确保指令传输的完整性、保密性和抗干扰性。 一、技术实现路径 链路层加密与认证 动态密钥协商&#xff1a;采用…...

【优秀三方库研读】【性能优化点滴】odygrd/quill 解决伪共享

一、伪共享&#xff08;False Sharing&#xff09;问题本质 当不同CPU核心频繁修改**同一缓存行&#xff08;Cache Line&#xff09;**中的不同变量时&#xff0c;会导致严重的性能下降。现代CPU的缓存系统以缓存行&#xff08;通常64字节&#xff09;为单位操作内存&#xff…...

JavaScript性能优化实战(6):网络请求与资源加载优化

引言 在现代Web应用开发中,网络性能已成为影响用户体验的关键因素。据统计,用户等待页面加载的耐心通常不超过3秒,超过这个时间,约40%的用户会选择离开。此外,Google的研究表明,页面加载时间每增加0.5秒,流量就会下降约20%。因此,优化网络请求和资源加载不仅关乎用户体…...

re题(49)BUUCTF-crackMe

BUUCTF在线评测 int wmain() {FILE *v0; // eaxFILE *v1; // eaxchar v3; // [esp3h] [ebp-405h]char v4[256]; // [esp4h] [ebp-404h] BYREFchar Format[256]; // [esp104h] [ebp-304h] BYREFchar v6[256]; // [esp204h] [ebp-204h] BYREFchar v7[256]; // [esp304h] [ebp-10…...

Python中的单例模式:深入探索元类与装饰器实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 单例模式(Singleton Pattern)是设计模式中的一种重要模式,确保一个类在整个应用中只有一个实例,并且提供全局访问点。Python语言作为一…...

深入解析 Babylon.js 中的 TransformNode.lookAt 方法

在 3D 开发中&#xff0c;控制对象朝向是一个基础但关键的需求。Babylon.js 作为一款强大的 Web3D 引擎&#xff0c;提供了 TransformNode.lookAt 方法来实现这一功能。本文将全面解析这个方法的使用技巧、参数含义以及常见应用场景。 方法基础 TransformNode.lookAt 的基本签…...

SpringCloud组件——Gateway

一.网关 1.问题提出 我们通过Eureka&#xff0c;Nacos解决了服务注册&#xff0c;服务发现的问题&#xff0c;使用SpringCloud LoadBalance解决了负载均衡的问题&#xff0c;使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的&#xff0c;可…...

Boost 库安装 (windows 11)

Boost 库安装 (windows 11 1 下载2 生成3 使用 1 下载 下载地址&#xff1a;https://www.boost.org/ 有的时候会需要历史版本下载&#xff1a; https://www.boost.org/users/history/ 2 生成 1、解压后点击 bootstrap.bat&#xff0c;会生成可执行程序b2.exe 2、双击运行b2.…...

lmms-eval--微调实战笔记

lmms-eval--大模型调用平台&#xff0c;方便新手上手大模型微调 lmms-eval的更多用法,没有mathversehttps://github.com/EleutherAI/lm-evaluation-harness.git 单卡运行&#xff0c;模型gpt-j-6B&#xff0c;数据集hellaswag git clone --depth 1 https://github.com/Eleuthe…...

序列密码算法ShanLooog512设计原理详解

序列密码算法ShanLooog512设计原理详解 ShanLooog512(闪龙512)为序列密码算法&#xff0c;内部状态为512比特&#xff0c;密钥长度为128或256比特&#xff0c;轮函数为FFFFFFFF&#xff0c;循环轮数为24轮&#xff0c;输出密钥流为512比特的状态。与Salsa20类似&#xff0c;内…...

Matplotlib可视化基础

1. 折线图 matplotlib.pyplot.plot() # 主要参数&#xff1a; x,y -- 接收array&#xff0c;表示X轴和Y轴对应的数据&#xff0c;无默认 color -- 接收特定string&#xff0c;指定线条的颜色&#xff0c;默认为None linestyle -- 接收特定string&#xff0c;指定线条的类型…...

Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options

在 Linux 内核的网络协议栈中,数据包的高效处理依赖于一系列精心设计的数据结构。这些结构体不仅需要存储网络数据的元信息,还需支持复杂的协议逻辑(如路由、分片、安全策略等)。本文聚焦两个核心结构体 struct inet_skb_parm 和 struct ip_options,解析它们的设计原理、功…...

oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示

oracle 查询指定用户下每个表占用空间的大小&#xff0c;倒序显示 使用场景&#xff1a;数据分析&#xff1b;导出医院正式库到开发环境时&#xff0c;查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中&#xff0c;要查询指定用户下每个表占用空间的大小并以倒序…...

Missashe考研日记-day29

Missashe考研日记-day29 1 专业课408 学习时间&#xff1a;3h学习内容&#xff1a; 今天先是把虚拟存储剩余的课听完了&#xff0c;然后就是做课后选择题&#xff0c;57道&#xff0c;已经接受了OS课后题尤其多的事实了。解决并且理解完习题之后就开始预习文件管理的内容&…...

【AI】【MCP】搭建私人王炸MCP自动化工作流

目录 一、什么是MCP 二、MCP大集合 三、准备工作 3.1 安装node.js 3.2 安装vscode 3.3 安装cline插件 3.3.1 安装 3.3.2 配置Cline 四、配置MCP服务 4.1 Search-mcp服务 4.2 playwright-mcp 服务 前言&#xff1a;梦想组合&#xff0c;轻松办公&#xff0c;告别手动&a…...

多元函数微分之传统方法和全微分法

一、传统方法 使用链式法则&#xff0c;先对中间变量&#xff08;如 u,v&#xff09;求偏导&#xff0c;再乘以中间变量对最终变量&#xff08;如 x,y&#xff09;的偏导。 二、全微分法 基于全微分形式不变性&#xff0c;直接对 zf(u,v) 求全微分 dz&#xff0c;再代入 du 和…...

新手SEO基础优化全解析

内容概要 对于刚接触SEO的新手而言&#xff0c;系统化理解优化逻辑是避免无效操作的关键。本文将从基础概念入手&#xff0c;逐步拆解搜索引擎排名的影响要素&#xff0c;围绕关键词分析、技术优化、内容策略三大核心模块&#xff0c;提供可落地的操作框架。通过结合工具使用说…...

MATLAB退火算法和遗传算法解决旅行商问题

模拟退火算法和遗传算法都是常用于解决旅行商问题&#xff08;TSP&#xff09;的优化算法&#xff0c;它们在原理、搜索方式、收敛速度和适用场景等方面存在一些区别&#xff1a; 原理 模拟退火算法&#xff1a;模拟退火算法的灵感来源于固体退火原理。固体在加热后缓慢冷却时…...

喜马拉雅卖身腾讯音乐:在线音频独立时代的终结

坦白说,这条消息一出来,喜马拉雅被卖掉不太奇怪,但是腾讯音乐会收购,还是有点意外。 喜马拉雅之前一度被称为中国版Audible平台,在过去几年里,活生生地把一手好牌打得稀烂。如今走到“卖身”这一步,既是无奈,也是必然。 简单回顾一下背景: 2012年,喜马拉雅成立,一…...

简单理解https与http

都是超文本传输协议&#xff0c;一个安全一个不安全&#xff0c;名字长的安全&#xff0c;名字短的不安全。 安全与不安全是居于什么分别的&#xff1f; 通过加密 http无加密。 httpshttp SSL/TSL&#xff08;加密&#xff09;来保障数据安全。加密传输 身份验证 SSL/TLS…...

打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解

目录 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解 1. 可观测体系&#xff1a;WhizardTelemetry 全家桶 2. 平台与多集群治理 3. CI/CD 与交付效率 4. 网络与流量入口 5. 安全与合规 6. 存储与数据保护 7. 平台集成优势 结语 打造…...

配置扩展ACL

1.扩展ACL简介&#xff1a; 扩展ACL可以更精确地控制基于源IP地址、目标IP地址、协议类型和端口号的流量。 2.配置背景&#xff1a; 为了实现公司内部只能使用FTP服务器传输文件并关闭其他所有服务和端口的需求&#xff0c;可以通过配置访问控制列表&#xff08;ACL&#xf…...

根据用户出生日期计算年龄

public static int calculateAgeFromDate(Date birthDate) { // 将 Date 转换为 LocalDate&#xff08;默认时区&#xff09; LocalDate birthLocalDate birthDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); // 获取当前日期LocalDate currentDate Local…...

测试基础笔记第十五天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、集合1.集合的定义二、使用集合列表去重 导包二、函数1.函数介绍2.定义函数3.调用函数4.函数实现登录案例5.函数的返回值 三、模块和包1.模块的概念(Module)2.模…...

【专题四】前缀和(3)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

STM32 USB配置详解

STM32 USB配置详解 一、USB基础概念 1.1 USB简介 USB (Universal Serial Bus) 是一种用于计算机与外部设备连接的串行总线标准&#xff0c;具有热插拔、即插即用等特点。STM32微控制器内置了多种USB接口&#xff0c;可实现各类USB应用。 1.2 USB速度等级 Low Speed (LS): …...

2025年Mapbox零基础入门教程(1)地图初始化

什么是mapbox&#xff1f; mapbox是一个地图框架&#xff0c;不仅提供前端渲染能力&#xff0c;还具备后端服务接口能力。 相较于openlayers&#xff0c;它可构建二维和三维地图&#xff0c;并支持优化导航路线和位置查询等功能。 开发中使用mapbox需引入库文件并设置token&…...

课外知识:你需要了解的Python类对象里面的__getattr__方法

你需要了解的Python类对象中的__getattr__方法 一、__getattr__基础概念 1. 方法定义 def __getattr__(self, name: str) -> Any:"""当访问不存在的属性时触发"""2. 核心特性 动态属性处理&#xff1a;拦截未定义的属性访问按需触发&…...

openGauss新特性 | DataKit支持PostgreSQL到openGauss的迁移能力

Postgresql-\>openGauss迁移工具debezium-connector-postgres 可获得性 本特性自openGauss 7.0.0-RC1版本开始引入。 特性简介 debezium-connector-postgres工具是一个基于Java语言的Postgresql到openGauss的复制工具。该工具提供了初始全量数据及对象&#xff08;视图、…...

【前端】跟进新趋势- PWA WebAssembly

不定期更新及补充实战。建议关注收藏点赞。 目录 PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09;WebAssembly&#xff08;WASM&#xff09; PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09; PWA 是一种提升 Web 应用…...

C++学习:六个月从基础到就业——模板编程:SFINAE原则

C学习&#xff1a;六个月从基础到就业——模板编程&#xff1a;SFINAE原则 本文是我C学习之旅系列的第三十六篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第十四篇&#xff0c;主要介绍C模板编程中的SFINAE原则。查看完整系列目录了解更多内容。 目录 C学习之…...

完美解决.NET Framework 4.0 中 System.Drawing 库不支持 WebP 格式的图像处理

如果你想在 .NET Framework 4.0 中使用 ImageMagick 处理图片&#xff0c;可以通过 Magick.NET 库来实现。Magick.NET 是 ImageMagick 的 .NET 封装&#xff0c;可以用来读取、写入、编辑图像。 以下是如何使用 Magick.NET 来处理图像并提取图像的宽度和高度。 步骤&#xff…...

网络基础概念:从菜鸟到入门

前言&#xff1a;快递小哥的故事 想象一下你要给朋友寄个礼物&#xff0c;这个过程其实和网络通信非常相似&#xff1a; 1. 你需要知道朋友的”地址“&#xff08;IP地址&#xff09; 2. 要注明是送到他家大门还是物业代收&#xff08;端口号&#xff09; 3. 要选择快递公司并…...

优先队列和单调队列(双端队列实现的)

这里写自定义目录标题 一、优先队列与单调队列二、优先队列2.1 概念2.2 增删查 判空2.3 示例代码 三、双端队列四、单调队列4.1 单调递增队列4.2 单调递减队列 一、优先队列与单调队列 二、优先队列 2.1 概念 一种特殊的队列&#xff0c;它与普通队列的主要区别在于元素的出…...