java基础(小技巧)
文章目录
- 一、日志输出
- 二、字符串拼接
- 三、日期比较
- 四、常用注解
- 五、Lombok的原理
提示:以下是本篇文章正文内容,下面案例可供参考
一、日志输出
之前使用的方式。在要使用的类里面定义日志类:
private static Logger logger = LoggerFactory.getLogger(“xxx”);
现在使用方式:
### pom.xml配置文件引入依赖<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency>
使用方式:
在要使用的类上添加注解@Slf4j
想输出日志,直接使用log.info或log.error 即可,不在需要定义日志类(和之前使用日志输出一样)。示例代码如下。
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class T1 {public static void main(String[] args) {MyObject obj = new MyObject("example", 42);String jsonString = JSONObject.toJSONString(obj);//将对象转为jsonObjectSystem.out.println(jsonString);log.info("输出日志信息:"+jsonString);log.error("输出日志信息:"+jsonString);}static class MyObject {private String name;private int value;public MyObject(String name, int value) {this.name = name;this.value = value;}// Getters and setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}}
}
二、字符串拼接
使用方式:String.format("%s|%s|%s", s1, s2, s3).以|作为连接
Object s1="A1";Object s2="B2";Object s3="C3";String stringDeal = String.format("%s|%s|%s", s1, s2, s3);System.out.println("据输出:"+stringDeal);据输出:A1|B2|C3
三、日期比较
isAfter 和 isBefore 是 java.util.Date 类中的两个方法,用于比较两个日期对象。
-
isAfter(Date when):
isAfter 方法用于检查调用该方法的日期对象是否在指定日期参数 when 之后。如果调用对象的日期晚于参数日期,则返回 true;否则返回 false。 -
isBefore(Date when):
isBefore 方法用于检查调用该方法的日期对象是否在指定日期参数 when 之前。如果调用对象的日期早于参数日期,则返回 true;否则返回 false。
import java.util.Date;public class DateComparison {public static void main(String[] args) {Date now = new Date(); // 当前日期和时间Date tomorrow = new Date(now.getTime() + 86400000); // 假设明天的日期// 检查现在是否在明天之后System.out.println("Is now after tomorrow? " + now.isAfter(tomorrow));// 检查现在是否在明天之前System.out.println("Is now before tomorrow? " + now.isBefore(tomorrow));// 检查明天是否在现在之后System.out.println("Is tomorrow after now? " + tomorrow.isAfter(now));// 检查明天是否在现在之前System.out.println("Is tomorrow before now? " + tomorrow.isBefore(now));}
}输出:
Is now after tomorrow? false
Is now before tomorrow? true
Is tomorrow after now? true
Is tomorrow before now? false
四、常用注解
@Data注解是一个综合性的注解,它可以为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等。例如:
| 注解 | 功能 |
|---|---|
@Getter | 为属性生成getter方法 |
@Setter | 为属性生成setter方法 |
@NoArgsConstructor | 为类生成无参构造器 |
@RequiredArgsConstructor | 为类生成包含所有final或@NonNull属性作为参数的构造器 |
@AllArgsConstructor | 为类生成包含所有属性作为参数的构造器 |
@Data | 为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等 |
@Builder | 为类生成一个构建器(builder)模式,让你可以用链式调用的方式创建对象 |
@Slf4j | 为这个类生成一个名为log的日志变量,使用org.slf4j.Logger作为日志框架。让可以方便地打印日志信息 |
@SneakyThrows | 让你在方法中抛出受检异常(checked exception),而不需要在方法签名中声明或者使用try-catch语句 |
@Value | 为类生成一个不可变(immutable)的对象,即所有属性都是final的,并且只有getter方法,没有setter方法 |
@Accessor | 为属性生成自定义的访问方法,让你可以控制方法的名称、修饰符、参数等等 |
@With | 为属性生成一个返回一个新对象的方法,让你可以用不可变(immutable)的方式修改对象的属性 |
@Singular | 为集合属性生成一个构建器(builder)模式,让你可以用链式调用的方式添加元素 |
@NonNull | 为方法或构造器的参数添加非空检查,如果参数为null,抛出NullPointerException |
@Cleanup | 为需要关闭的资源自动调用close方法,避免资源泄漏 |
@Synchronized | 为方法添加同步锁,避免多线程问题 |
@EqualsAndHashCode | 为类生成equals和hashCode方法,根据属性的值判断对象是否相等 |
@ToString | 为类生成toString方法,返回对象的字符串表示 |
@Delegate | 为类生成委托(delegate)方法,让你可以调用另一个对象的方法,而不需要自己编写 |
@Val | 表示一个不可变的局部变量,相当于使用final修饰符 |
@Var | 表示一个可变的局部变量,相当于省略了类型声明 |
举几个常用例子:
- @Data 常用
@Data注解是一个综合性的注解,它可以为类生成所有常用的方法,包括getter和setter、equals和hashCode、toString、构造器等等。例如:
import lombok.Data;@Data
public class User {private String name;private int age;
}
这段代码相当于:
public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age && Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
可以看到,使用@Data注解可以大大减少你的代码量,让你的类更简洁和清晰。当然,如果你不想生成所有的方法,你也可以使用其他的注解来选择性地生成你需要的方法。
五、Lombok的原理
Lombok利用了Java的注解处理器(Annotation Processor)机制,它可以在编译时扫描和处理注解,并生成额外的Java代码。Lombok通过实现一个自定义的注解处理器,来拦截和修改抽象语法树(AST),从而在类中添加相应的方法,字段,构造器等。Lombok还提供了一个插件,可以让IDE在编辑时也能识别和显示Lombok生成的代码,从而避免编译错误和提示信息的不一致。
Lombok的原理可以用以下几个步骤来概括:
- 定义一个注解,比如@Getter,用来标记需要生成getter方法的类或字段。
- 定义一个注解处理器,比如GetterProcessor,用来处理@Getter注解,并在类中生成相应的getter方法。
- 在注解处理器中,使用Lombok提供的API,比如JavacAST,JavacHandlerUtil等,来获取和修改AST。
- 在编译时,使用javac或者其他工具(比如maven,gradle等)来调用注解处理器,并传入源代码。
- 注解处理器扫描源代码中的注解,并根据注解的参数和目标来生成相应的代码,并添加到AST中。
- 编译器根据修改后的AST来生成字节码文件(.class文件)。
参考:参考Lombok
- 总结: Lombok是一个非常实用的Java库,它可以让我们的代码更加简洁,可读,健壮。Lombok有很多优点,但也有一些缺点,比如可能会影响代码的调试,测试,维护等。因此,在使用Lombok时,我们需要权衡利弊,根据自己的需求和喜好来选择合适的注解和配置。
相关文章:
java基础(小技巧)
文章目录 一、日志输出二、字符串拼接三、日期比较四、常用注解五、Lombok的原理 提示:以下是本篇文章正文内容,下面案例可供参考 一、日志输出 之前使用的方式。在要使用的类里面定义日志类: private static Logger logger LoggerFactory…...
Android Studio 安装配置教程(Windows最详细版)
目录 前言 Android Studio 下载 Android Studio 安装 Android Studio 使用 一、创建默认项目(Compose) 二、创建常规项目 三、使用ViewBinding 四、查看Gradle版本、SDK版本、JDK版本 ① Gradle版本 ② SDK版本 ③ JDK版本 前言 Android开发…...
Cesium绘制可编辑线
Cesium 第一章 绘制可编辑线 Screen-2024-09-17-202059的副本 文章目录 Cesium一、绘制线二、编辑线三、使用 一、绘制线 1、方法 //场景相机控制viewer.scene.screenSpaceCameraController.enableRotate false; //cesium相机控制 绘制和编辑时 禁止转动场景// 鼠标样式修改…...
【算法】差分思想:强大的算法技巧
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
微软开源项目 Detours 详细介绍与使用实例分享
目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…...
Numba基础
1. Numba 基础 1.1 什么是 Numba? Numba 是一个 JIT 编译器,用于加速数值计算。它通过即时编译技术,将 Python 代码在运行时编译为机器代码,极大地提升执行速度,特别适合循环和矩阵操作等密集型计算。 2. Numba 基本…...
[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入
一,初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录,程序中操作文件和目录,都可以通过File类来完成。 通过这个File对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获…...
oracle停止当前运行的JOB或kill会话
在Oracle中,可以使用DBA_SCHEDULER_JOBS视图来查找当前正在运行的作业(job),并使用DBMS_SCHEDULER.STOP_JOB过程来停止它们 SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS WHERE STATE RUNNING; SELECT * FROM DBA_SCHEDULE…...
SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue
介绍 在默认情况下,RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟 一旦MO宕机,内存中的消息会丢失内存空间有限,当消费者故障或处理过慢时,会导致消息积压,引发MQ阻塞 在消息队列运行的过程中…...
CLIP论文中关键信息记录
由于clip论文过长,一直无法完整的阅读该论文,故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的(提出背景、训练数据、设计模式、训练超参数、prompt的作用),clip的能力(clip的模型版本、clip…...
sshj使用代理连接服务器
之前我是用jsch连接服务器的,但是没办法使用私钥连接,搜了一下似乎是不支持新版的SSH-rsa,并且jsch很久没更新了,java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow 没办法…...
【Leetcode:1184. 公交站间的距离 + 模拟】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
VRRP 笔记
一、概念: vrrp:Virtual Router Redundancy Protocol 虚拟路由冗余协议,当网关发生故障时,进行主备切换,保证业务连续性 把多台物理机的网关虚拟成一台Virtual Router,称为 VRID VIP:虚拟IP VM…...
【洛谷】P3743 小鸟的设备 的题解
【洛谷】P3743 小鸟的设备 的题解 题目传送门 题解 水一道二分 qaq 刚开始考虑的是动态规划,但是动态规划并不能维护题目所要求的东西。所以我们将思路转向另一种求最值问题的方法:二分答案。 首先,如果一个设备在 t t t 的时间内消耗的…...
算法面经手撕系列(2)--手撕BatchNormlization
BatchNormlization BatchNormlization的编码流程: init阶段初始化 C i n C_in Cin大小的scale向量和shift向量,同时初始化相同大小的滑动均值向量和滑动标准差向量;forward时沿着非channel维度计算均值、有偏方差依据得到均值和有偏方差进…...
mysql-搭建主从复制
文章目录 1、准备主服务器2、准备从服务器3、主库配置3.1、创建MySQL主服务器配置文件: 4、从库配置5、搭建主从&测试5.1、使用命令行登录MySQL主服务器5.2、主机中查询master状态:5.3、从机中查询slave状态:5.4、主机中创建slave用户&am…...
MiniMaxi-共创智能新体验新手入门
新手快速入门 注册指南 个人用户 直接注册即可。 企业团队 主账号:注册时填写的姓名与手机号将成为企业账号的管理员。子账号:在用户中心创建,数量不限。 主账号与子账号权益 相同权益:子账号享有与主账号相同的使用权益和速…...
Docker torchserve 部署模型流程
1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…...
mybatis开启日志
步骤很详细,直接上教程 配置文件的文件格式可能有所不同,这里列举两种 配置方法 一. application.properties(默认 # 配置mybatis的日志信息 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl二. application.y…...
MobaXterm : Network error: Connection refused(连接被拒绝)
具体报错如下如所示: 首先进行问题排查 ① 检查SSH服务是否运行 sudo service ssh status ② 检查SSH服务是否已启动(启用返回 enable) sudo systemctl is-enabled ssh ③ 查看所有的端口 sudo netstat -tulnp ④ 查看SSH使用的22号端口有…...
经验值|React 实时数据图表性能为什么会越来越卡?
在使用 React 和 Highcharts 创建实时图表时,性能下降通常与以下几个因素有关:频繁更新状态:如果你频繁更新图表的数据状态,React 可能会进行多次重渲染,导致性能下降。建议使用 useRef 来引用图表实例,避免…...
万象视界灵坛效果展示:血条样式进度条直观呈现各标签置信度差异
万象视界灵坛效果展示:血条样式进度条直观呈现各标签置信度差异 1. 平台概览 万象视界灵坛是一款基于OpenAI CLIP技术的高级多模态智能感知平台。它通过创新的像素风格界面,将复杂的视觉识别任务转化为直观的交互体验。平台采用16-Bit游戏美学设计&…...
nRF52832蓝牙开发实战:手把手教你配置广播与扫描(基于SES和nRF5 SDK 15.3)
nRF52832蓝牙开发实战:从零配置广播与扫描全流程解析 在物联网设备开发中,蓝牙低功耗(BLE)技术因其低功耗、低成本的特点成为连接智能设备的首选方案。作为Nordic Semiconductor的明星产品,nRF52832凭借其强大的处理能…...
别再只记*#*#284#*#*了!揭秘小米手机日志抓取的‘售后模式’:CIT工具(*#*#6484#*#*)的隐藏用法与解读
解锁小米手机CIT工具的隐藏潜能:从硬件诊断到日志深度解析 在智能手机高度普及的今天,用户对设备问题的自主排查需求日益增长。小米手机内置的CIT工具(Customer Interface Test)作为售后服务的核心诊断利器,其实蕴藏着…...
Claude Code桌面控制实战:macOS开启Computer Use指南
Claude Code 的 computer use 功能,是 2026 年 3 月正式上线的原生 macOS 桌面控制能力,让 Claude 可以打开 App、点击、输入、截图,直接在你的真实桌面上完成 GUI 任务。它以内置 MCP 服务器的形式集成到 Claude Code CLI 中,通过…...
5大核心功能深度解析:Umi-OCR开源离线文字识别工具的技术实现与应用指南
5大核心功能深度解析:Umi-OCR开源离线文字识别工具的技术实现与应用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二…...
实战AI情感分析:基于快马平台构建电商评论智能洞察系统
最近在做一个电商数据分析项目时,发现人工处理海量商品评论实在太费时费力。于是尝试用AI情感分析技术来提升效率,在InsCode(快马)平台上快速搭建了一个评论智能分析系统。整个过程比想象中简单很多,分享下具体实现思路: 系统架构…...
新型macOS Infinity窃密木马利用Nuitka Python载荷与ClickFix传播
首例针对macOS的ClickFix攻击活动Malwarebytes研究人员发现名为Infinity Stealer的新型macOS信息窃取木马,该木马使用Nuitka编译的Python载荷,通过伪造Cloudflare验证页面诱骗用户执行终端命令进行传播。据Malwarebytes报告指出,这是首次观察…...
3步掌握WindowResizer:免费强制调整任意窗口大小的终极方案
3步掌握WindowResizer:免费强制调整任意窗口大小的终极方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的窗口尺寸而烦恼吗?无论你面对的…...
UDOP-large实战手册:英文技术文档FAQ自动生成Prompt模板库
UDOP-large实战手册:英文技术文档FAQ自动生成Prompt模板库 1. 引言:当技术文档遇上智能问答 想象一下这个场景:你刚拿到一份50页的英文技术白皮书,需要快速了解它的核心内容。传统做法是什么?打开PDF,从头…...
