一、Unsafe 类概述
定位:Java 底层 “后门级” 工具类,绕开 JVM 安全限制,直接操作内存、线程等底层资源。
风险:操作不当会导致 JVM 崩溃、内存泄漏,官方仅允许 JDK 内部类库使用,普通开发需谨慎。
获取方式:通过反射破解访问限制(因 Unsafe.getUnsafe() 有安全校验,普通类调用会抛 SecurityException)。
二、6 大核心功能与示例1. 内存管理
能力:像 C 指针一样直接分配、释放、操作内存,支持堆外内存(不受 JVM 垃圾回收管理)。
核心方法:allocateMemory(分配内存)、freeMemory(释放内存)、copyMemory(内存拷贝)、putInt/getInt(读写内存值)。
示例:
12345Unsafe unsafe = getUnsafe();long addr = unsafe.allocateMemory(1024); // 分配 1024 字节内存unsafe.putInt(addr, 666); // 写 int 值到内存地址int value = unsafe.getInt(ad ...
@JsonFormat 注解:日期格式化核心用法笔记@JsonFormat 是 Jackson 框架提供的注解,用于统一控制 日期类型(如 Date)的序列化与反序列化格式,解决前后端日期数据交互的格式不一致问题。
一、核心作用
序列化:将后端的 Date 对象,转换为指定格式的字符串(如 2025-10-29 16:00:00)返回给前端,替代默认的 ISO 格式(如 2025-10-29T16:00:00.000+00:00)。
反序列化:将前端提交的指定格式日期字符串(如 2025-10-29 16:00:00),转换为后端的 Date 对象,确保格式匹配可正常解析。
二、关键属性与配置示例1. 常用属性
属性名
作用说明
pattern
必选,指定日期格式字符串,如 yyyy-MM-dd(日期)、yyyy-MM-dd HH:mm:ss(日期 + 时间)。
timezone
必选,指定时区,避免时区偏移导致日期偏差,国内统一使用 GMT+8(东八区)。
2. 实际使用示例在实体类的 Date 类型字段上直接标注,实现全局统一格式:
12345678910imp ...
Knife4j 底层基于 Swagger 实现,是对 Swagger 的增强封装,主要用于生成符合中国开发者习惯的接口文档。其核心依赖和实现逻辑如下:
Knife4j 使用,参考:https://doc.xiaominfo.com/docs/quick-start
访问 http://ip:port/doc.html 即可查看 Knife4j 接口文档访问 http://localhost:8080/swagger-ui/index.html 即可查看 Swagger 接口文档
swagger标准常用注解;
注解
标注位置
作用
@Tag
controller 类
描述 controller 作用
@Parameter
参数
标识参数作用
@Parameters
参数
参数多重说明
@Schema
model 层的 JavaBean
描述模型作用及每个属性
@Operation
方法
描述方法作用
@ApiResponse
方法
描述响应状态码等
Knife4j(基于 Swagger)与@RestControllerAdvice(全局异常处理器)在版本兼容性或扫描逻辑上存在冲突,具体原因和解决方法如下:
一、冲突原因Knife4j 在生成接口文档时,会通过反射扫描项目中的@ControllerAdvice(或@RestControllerAdvice)类。如果你的项目中 Spring Boot 版本(尤其是 3.x 及以上)与 Knife4j 版本不兼容,就会触发ControllerAdviceBean构造方法不匹配、扫描逻辑冲突等问题,导致接口文档无法正常加载。
二、解决方案(无需删除全局异常处理)推荐通过 “隐藏异常处理器类” 来规避扫描冲突,既保留全局异常处理功能,又能正常显示接口文档:
添加依赖:确保引入 Swagger 的@Hidden注解依赖(如果是 Knife4j+Spring Boot 3.x,通常已包含):
12345<dependency> <groupId>io.swagger.core.v3</groupId> <artifactId>sw ...
各类 “O” 的设计核心是遵循单一职责原则,让不同对象专注于某一特定功能,避免职责混乱,提升代码可维护性。
1. POJO(Plain Ordinary Java Object):普通 Java 类
定义:最基础的 Java 类,无特定框架依赖,仅包含字段、getter/setter、无参构造等基础结构。
核心职责:纯粹的 “数据载体”,不包含业务逻辑、数据访问逻辑或传输相关处理。
使用场景:作为所有 “O” 的基础形态,其他专用对象(如 VO、DTO)本质上都是 POJO 的细分。
2. DAO(Data Access Object):数据访问对象
定义:专门负责与数据库(或其他数据源)交互的对象。
核心职责:封装数据访问逻辑,如执行 SQL 语句、调用 ORM 接口(MyBatis、JPA),提供 “增删改查” 操作方法。
使用场景:隔离业务层与数据层,业务层通过调用 DAO 方法操作数据,无需关注具体数据库交互细节。
3. DTO(Data Transfer Object):数据传输对象
定义:专门用于跨层、跨服务传输数据的对象。
核心职责:按需封装传输所需的数据, ...
校验注解
作用
@AssertFalse
验证Boolean类型字段是否为false
@AssertTrue
验证Boolean类型字段是否为true
@DecimalMax
验证字符串表示的数字是否小于等于指定的最大值
@DecimalMin
验证字符串表示的数字是否大于等于指定的最小值
@Digits(integer, fraction)
验证数值是否符合指定的格式,integer指定整数精度,fraction指定小数精度
@Email
验证字符串是否为邮箱地址格式
@Future
验证日期是否在当前时间之后
@Past
验证日期是否在当前时间之前
@Min(value)
验证数字是否大于等于指定的最小值
@Max(value)
验证数字是否小于等于指定的最大值
@Null
验证对象是否为null
@NotNull
验证对象是否不为null, 与@Null相反(a!=null)
@NotEmpty
验证字符串是否非空(a!=null && a!=“”)
@NotBlank
...
一、JSR 303 定义Java 为 Bean 数据合法性校验提供的标准框架,包含于 JavaEE 6.0 标准中。
核心机制:通过在 Bean 属性上标注 @NotNull、@Max 等标准注解定义校验规则,通过标准接口完成校验。
二、数据校验使用流程
引入依赖:
spring-boot-starter-validation(整合 JSR 303 实现,如 Hibernate Validator)。
定义数据封装 Bean(VO):
通常为接收前端参数的实体类(如 EmployeeAddVo)。
标注校验注解:
在 Bean 字段上添加标准注解(如 @NotBlank、@Email)或自定义注解,指定错误提示消息。
开启校验:
在 Controller 方法参数上使用 @Valid 或 @Validated 触发校验。
处理校验结果:
方式 1:通过 BindingResult 手动获取校验错误(需紧跟被校验参数)。
方式 2:结合全局异常处理,统一捕获校验失败异常(推荐)。
自定义校验规则:
通过 “自定义注解 + 校验器” 实现复杂校验(如性别只能为 ...
可以用类似下面这种方式包装类
TCP服务端:
12345678ServerSocket serverSocket = new ServerSocket(9000); Socket accept = serverSocket.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream())); //获取客户端消息 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream())); //相应消息 PrintWriter pw = new PrintWriter(accept.getOutputStream(),true); //自动刷新缓冲区
TCP客户端:
1234567Socket socket = new Socket(InetAddress.getLoopbackAddress(),9000); //确认发送地址 Buf ...
一、核心概念:端口分工与通信流程UDP 通信中,发送端和接收端通过约定的端口完成数据对接,两者角色不同,端口作用也不同:
接收端:需绑定固定端口(如 9000),作为 “监听端口”,专门等待接收数据(类似 “固定门牌号”)。
发送端:需指定目标端口(必须与接收端的固定端口一致,如 9000),作为 “发送目标”(类似 “收件人门牌号”);发送端自身端口可随机分配(临时端口)或固定。
通信流程:接收端先启动并监听端口 → 发送端向目标端口发送数据 → 接收端从监听端口接收数据。
二、完整代码示例1. 接收端(Receiver)12345678910111213141516171819202122232425262728293031package test1029;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class Receiver { public static void main(String[] args) thr ...
一、核心作用InetAddress 是 Java 中用于表示 IP 地址 的类(位于 java.net 包下),封装了 IP 地址的相关信息(如主机名、IP 地址字符串等),提供了操作 IP 地址的常用方法,是网络编程中处理 IP 地址的基础工具。
二、主要特点
无构造方法:不能直接通过 new 创建对象,需通过类提供的静态方法获取实例。
封装 IP 信息:包含主机名(如 www.baidu.com)和 IP 地址(如 180.101.50.242),支持 IPv4 和 IPv6 地址。
三、常用静态方法(获取实例)
方法
功能描述
InetAddress.getByName(String host)
根据主机名(如域名)或 IP 地址字符串,获取对应的 InetAddress 实例。例:InetAddress.getByName("www.baidu.com") 或 getByName("127.0.0.1")。
InetAddress.getLocalHost()
获取本机的 InetAddress 实例(包含本机主机名和 I ...



