外观
一句话答案
注解是元数据标记,通过 @Retention 控制保留策略,运行时注解靠反射读取,编译时注解靠 APT 处理。
核心要点
Java 17 是 LTS 版本,Java 21 是下一个 LTS,两个版本之间引入了大量实用特性:
1. Record 类(JDK 16 正式)
- 不可变数据载体,用一行代码定义数据类
- 自动生成
equals()、hashCode()、toString()、全参构造器、访问器方法 - 替代 Lombok
@Data的典型场景:DTO、值对象、方法多值返回
java
record Point(int x, int y) {}
// 等价于一个 final class,包含 private final 字段、构造器、x()、y()、equals、hashCode、toString2. Sealed Classes — 密封类(JDK 17 正式)
- 限制哪些类可以继承/实现当前类,让继承体系变得可控
- 配合 pattern matching 的 switch 可做穷举检查,编译器能在缺少分支时报错
java
sealed interface Shape permits Circle, Rectangle {}
final class Circle implements Shape { double radius; }
final class Rectangle implements Shape { double w, h; }3. Text Blocks — 文本块(JDK 15 正式)
- 用三引号
"""编写多行字符串,保留格式,无需手动拼接和转义 - 写 SQL、JSON、HTML 模板更清晰
java
String json = """
{
"name": "test",
"value": 42
}
""";4. Pattern Matching for instanceof(JDK 16 正式)
- 类型匹配后自动绑定变量,消除冗余的强制类型转换
java
// 旧写法
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// 新写法
if (obj instanceof String s) {
System.out.println(s.length());
}5. Pattern Matching for switch(JDK 21 正式)
- switch 支持类型模式匹配 + 守卫条件(
when),替代大量 if-else 链 - 配合 Sealed Classes 做穷举检查,无需 default 分支
java
String describe(Shape shape) {
return switch (shape) {
case Circle c when c.radius() > 100 -> "大圆";
case Circle c -> "圆: r=" + c.radius();
case Rectangle r -> "矩形: " + r.w() + "x" + r.h();
// sealed class 已穷举,不需要 default
};
}6. Virtual Threads — 虚拟线程(JDK 21 正式)
- 由 JVM 调度的轻量级线程,创建成本极低(约 1KB 栈内存),可同时运行百万级线程
- 解决传统线程池在高并发 IO 密集场景下线程数受限的瓶颈
- 详见并发编程专题
追问与易错
追问方向:
- @Retention 三种策略的区别?(SOURCE 编译丢弃/CLASS 字节码保留/RUNTIME 运行时反射可读)
- Spring 的注解是怎么生效的?(BeanPostProcessor 通过反射扫描注解处理)
- 自定义注解怎么做?(@interface + 元注解 + 处理逻辑)
易错点:
- ❌ "注解本身有逻辑"——注解只是标记,逻辑在处理器(反射/APT)中
- ❌ 混淆编译时注解和运行时注解的处理方式
💡 记忆锚点
Record一行代替整个POJO,Sealed类把继承关系焊死(permits白名单),switch模式匹配让instanceof和强转合二为一,虚拟线程1KB一个可开百万级——Java17到21是"少写废代码"的版本跃迁。