Java

浏览该分类下的所有文章

反射的基本概念

反射是一种在运行时动态获取、创建、检查和调用类及其成员(包括 private)的机制,核心类为 Class、Constructor、Method、Field。它可用于突破访问限制、实现自定义注解、动态加载第三方 jar、按需加载以缩短编译和初始化时间。实现原理是 ClassLoader 将 .class 文件加载后生成 Class 对象,反射通过上述四个类操作这些对象。优点是灵活自由,缺点包括性能下降、破坏封装导致安全风险以及 API 变动时的兼容性问题。适度、按需使用可将影响降至可接受范围。

如何让 a == 1 && a == 2 && a == 3同时成立?

文章介绍利用 Java 的 `IntegerCache` 缓存特性,使表达式 `a == 1 && a == 2 && a == 3` 成立。通过反射获取 `Integer` 的内部类 `IntegerCache`,把缓存中下标对应的对象(原本分别是 1、2、3)改为同一个实例(1),随后 `Integer.valueOf` 或强制装箱得到的对象均指向同一内存地址,比较结果为 `true`;而使用 `new Integer` 会创建全新对象,地址不同,比较为 `false`。文中给出完整代码、运行结果,并解释 `valueOf` 与 `new` 的实现差异,强调此技巧体现了对 JDK 源码和缓存机制的深入了解,可用于性能预热等实际场景。

for(;;)和while(true)的区别

文章说明 Java 中的两种死循环写法 `for(;;)` 与 `while(true)` 在功能上完全等价。通过对比 JDK 源码示例和编译后生成的字节码,发现两者的字节码已完全相同,现代编译器会进行等价优化。之所以很多作者仍倾向使用 `for(;;)`,是源于早期 C 语言和早期 Java 编译器中 `for(;;)` 生成的指令更少、占用更少内存的历史习惯。如今两者在性能和行为上没有差别,仅是编码风格的选择。

docker实时查看容器日志(实用)

本文介绍了在 Docker 中实时查看容器日志的常用命令。使用 `docker logs -f --tail 10 <容器>` 可实时刷新最新 10 行;仅查看最新 10 行则用 `docker logs --tail 10 <容器>` 或 `docker logs <容器> | tail -n 10`。若需查看日志开头的前 10 行,可使用 `docker logs <容器> | head -n 10`。通过管道结合 `grep` 可以在日志中搜索关键字,如 `docker logs <容器> | grep 'ERROR'`,进一步配合 `tail -n 2` 只获取最新的两条错误记录。上述命令简洁高效,适用于快速定位和监控容器日志。

groovy安装教程

本文介绍了 Groovy 的快速入门步骤:从官方或网盘下载 groovy‑sdk(4.0.4),解压至指定目录后配置环境变量并验证安装;随后在 IntelliJ IDEA 中新建 Groovy 项目,选择已安装的 Groovy 版本或对应文件夹;项目创建完成后即可在 src 目录编写 Groovy 脚本,示例代码演示了字符串、GString 的使用及输出。

this与super关键字详解

本文系统阐述了 Java 中关键字 **this** 与 **super** 的概念、作用及使用规范。`this` 代表当前对象实例,可用于访问本类属性/方法、区分形参与成员变量、在构造函数首行调用本类其他构造器。`super` 代表直接父类对象,可调用父类非私有成员、区分同名属性/方法、在子类构造函数首行显式调用父类构造器。文中通过 Father‑Son 示例演示了隐式 `super()` 导致的编译错误及两种解决方案(添加无参构造或显式 `super(args)`),并对两关键字的查找范围、功能等差异进行对比总结。

还在频繁定义常量?不如试试用枚举代替

常量经常被写成一组固定字符串,实际应使用枚举。枚举本质是类,可定义属性、方法,提供类型安全、可直接在switch中使用、拥有values()遍历、可封装额外信息(如HttpStatus)并实现业务逻辑。相较于单纯的String常量,代码更简洁、可靠,且易于维护。虽不是所有常量都必须改为枚举,但在成员在编译期已确定的情形下,枚举是更优选择。

Git代码提交规范

Git提交遵循“type(scope): message”格式,其中type指提交类别,如feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)、perf(性能)、test(测试)、build(构建工具)、revert(撤销)和chore(辅助),scope说明影响范围(如权限模块、首页),message为简短说明,避免过长。示例:fix(系统菜单图标):添加缺少的图标。

Java实现给PDF文件加水印、图片、签名(含测试类)

本文示例使用 iText5 在 Java 中为 PDF 添加文字水印、坐标文字、关键字定位文字、图片和签名。首先在 pom 中引入 `itextpdf` 与 `itext-asian` 依赖,随后提供 `PdfUtil` 工具类,实现:① `addWaterMark` 根据页面尺寸和透明度循环绘制倾斜文字水印;② `addText` 按坐标矩形在指定页插入文本;③ `addTextByKeyword` 解析页面文本,定位关键字坐标后写入新内容;④ `addImage` 与 `addSign` 在给定坐标或关键字位置嵌入图片/签章;⑤ `addImageAndText` 同时添加图片和文字。文末附带完整的 JUnit 测试示例,演示上述方法的调用方式与效果。

给PDF添加水印并保存(Java实现)

本文示例了使用 iText 5 为 PDF 添加文字水印的完整实现。首先在 Maven 中引入 `itextpdf` 与 `itext-asian` 依赖;随后编写 `PDFUtils` 工具类的 `addWaterMark` 方法,读取原 PDF、创建 `PdfStamper`、加载自定义字体并设置透明度、字体大小、倾斜角度及水平垂直间隔,在每页循环绘制水印文本;最后提供 `AddWaterMarkTest` 测试类演示调用。代码演示了如何通过 Java 程序批量为 PDF 添加可配置的水印并保存为新文件。

代码优化的部分实例

文章通过几个实际案例展示常见的代码优化手段。先用 String.format 代替“+”或 StringBuilder 拼接长字符串,提高可读性;再将普通 I/O 改为 BufferedInputStream/BufferedOutputStream 并使用缓冲区,显著提升文件读写性能;通过把循环中第二层集合转为 Map ,利用键直接查找,减少嵌套循环次数;强调使用完 ResultSet、PreparedStatement、Connection 等资源后必须按顺序关闭,防止泄漏;最后指出频繁创建数据库连接的开销,推荐使用 Druid、C3P0 等连接池来复用连接,提高并发和稳定性。整体强调简洁、可读、低耗资源的编程实践。

Linux命令速查手册

本文提供Linux常用命令速查,包括查看系统硬件信息(arch、uname、/proc/*、lspci、lsusb),时间管理(date、cal、clock),关机/重启(shutdown、reboot),文件目录操作(cd、ls、tree、mkdir、rm、mv、cp、ln、touch),文件搜索(find、locate、whereis、which),挂载/卸载文件系统(mount、umount、fuser),磁盘空间查询(df、du、rpm、dpkg),用户组管理(useradd、groupadd、passwd、chage),权限与属性设置(chmod、chown、chgrp、chmod +s/g/t、chattr),压缩打包(gzip、bzip2、tar、zip、rar),以及RPM 包的安装、查询、验证、升级和删除等完整示例。