本项目包含了一系列Java高级特性的示例代码,主要涉及Java Agent技术、多线程编程、IO操作等。
src/
├── main/
│ └── java/
│ └── com/
│ └── zhouwy/
│ └── advancedjava/
│ ├── agent/ # Java Agent 相关类
│ │ └── MethodAgentMain.java # Agent 主类
│ ├── concurrency/ # 并发编程相关类
│ │ ├── lock/
│ │ │ ├── ConditionTest.java
│ │ │ └── RenentrantLockTest.java
│ │ ├── forkjoin/
│ │ │ └── forkJoin.java
│ │ └── thread/
│ │ ├── ThreadApp.java
│ │ └── ThreadsInterrupt.java
│ ├── io/ # IO操作相关类
│ │ ├── file/
│ │ │ ├── CharByte.java
│ │ │ ├── FileUtils.java
│ │ │ └── RandAccessFileTests.java
│ │ └── IOTests.java
│ ├── interview/ # 面试题示例
│ │ ├── records/
│ │ │ ├── CandidateProfile.java
│ │ │ ├── CandidateProfileClassic.java
│ │ │ ├── InterviewResult.java
│ │ │ ├── InterviewResultClassic.java
│ │ │ └── RecordDemoApp.java
│ │ ├── serialization/
│ │ │ ├── CandidatePayloadRecord.java
│ │ │ ├── CandidatePayloadClassic.java
│ │ │ └── JsonSerializationDemoApp.java
│ │ ├── concurrency/
│ │ │ ├── ConcurrencyFeatureShowcaseApp.java
│ │ │ ├── ThreadPoolTuningDemo.java
│ │ │ ├── CompletableFutureOrchestrationDemo.java
│ │ │ ├── SemaphoreBulkheadDemo.java
│ │ │ ├── CountDownLatchBatchDemo.java
│ │ │ ├── LongAdderVsAtomicLongDemo.java
│ │ │ ├── StampedLockOptimisticReadDemo.java
│ │ │ ├── AqsCustomMutexDemo.java
│ │ │ ├── LockSupportHandshakeDemo.java
│ │ │ ├── ConcurrentSkipListMapRankingDemo.java
│ │ │ ├── CopyOnWriteArrayListReadMostlyDemo.java
│ │ │ ├── ConcurrentHashMapComputeDemo.java
│ │ │ └── CyclicBarrierPhaserDemo.java
│ │ └── frameworks/
│ │ ├── spring/
│ │ │ ├── InterviewAiProperties.java
│ │ │ ├── InterviewAiConfig.java
│ │ │ └── InterviewRecordController.java
│ │ ├── springdata/
│ │ │ ├── InterviewResultEntity.java
│ │ │ ├── InterviewSummary.java
│ │ │ └── InterviewResultRepository.java
│ │ └── jdk/
│ │ └── RecordIntrospectionDemo.java
│ └── demo/ # 示例程序
│ ├── AgentTest.java # Agent 测试类
│ └── AttachMain.java # Attach 示例类
项目演示了Java Agent的两种使用方式:
- 在JVM启动时通过命令行参数加载Agent
- MethodAgentMain.java 实现了premain方法
- 可以在类加载时对字节码进行修改
- 在JVM运行时动态加载Agent
- MethodAgentMain.java 实现了agentmain方法
- 使用Javassist库对目标类的方法进行增强
包含了多个关于Java并发编程的示例:
- ConditionTest.java - Condition条件变量使用示例
- RenentrantLockTest.java - 可重入锁使用示例
- ThreadsInterrupt.java - 线程中断处理示例
- forkJoin.java - Fork/Join框架使用示例
提供了各种IO操作的示例代码:
- CharByte.java - 字符与字节流操作示例
- FileUtils.java - 文件工具类示例
- RandAccessFileTests.java - 随机访问文件示例
- IOTests.java - 基础IO操作示例
新增了 record 的面试高频用法示例:
- CandidateProfile.java - 紧凑构造器校验、重载构造器、防御性拷贝
- CandidateProfileClassic.java - 传统POJO等价实现(字段/getter/equals/hashCode/toString 手写)
- InterviewResult.java - 组合record、静态工厂方法、参数归一化
- InterviewResultClassic.java - 传统POJO等价实现(便于与record对照)
- RecordDemoApp.java - 访问器、值相等、toString 示例
- CandidateProfileTest.java - 单元测试覆盖核心行为
对照重点:
- record 访问器是
name(),传统POJO通常是getName() - record 自动生成
equals/hashCode/toString,传统POJO需要手写 - record 同样可以写构造器校验和业务方法,不只是“裸字段”
新增了 record + 传统POJO 在两种 JSON 工具下的对照示例:
- CandidatePayloadRecord.java - record + 旧字段别名兼容(
years->yearsOfExperience) - CandidatePayloadClassic.java - 传统POJO写法对照
- JsonSerializationDemoApp.java - Jackson/Fastjson2 序列化与反序列化演示
- JsonSerializationExamplesTest.java - 兼容性与往返测试
新增了 Spring Boot / Spring Web / Spring Data JPA / JDK 的 record 代码示例:
- InterviewAiProperties.java -
@ConfigurationProperties+ record 配置绑定 - InterviewRecordController.java - Spring Web 请求/响应 DTO 使用 record
- InterviewResultRepository.java - JPA 用 record 做查询投影(constructor expression)
- RecordIntrospectionDemo.java - JDK 反射 API 读取 record 元数据
- RecordIntrospectionDemoTest.java - JDK record 反射测试
新增了可直接运行的并发小实验(均带中文注释):
- ConcurrencyFeatureShowcaseApp.java - 串联入口,一次跑完全部 demo
- ThreadPoolTuningDemo.java - 线程池参数与拒绝策略(CallerRuns 背压)
- CompletableFutureOrchestrationDemo.java - 并行编排、超时与兜底
- SemaphoreBulkheadDemo.java - Semaphore 限流/舱壁
- CountDownLatchBatchDemo.java - 批任务汇聚
- LongAdderVsAtomicLongDemo.java - 高竞争计数对比
- StampedLockOptimisticReadDemo.java - 乐观读 + 回退悲观读
- AqsCustomMutexDemo.java - AQS 自定义同步器(不可重入互斥锁)
- LockSupportHandshakeDemo.java - LockSupport 线程握手
- ConcurrentSkipListMapRankingDemo.java - 跳表有序并发容器
- CopyOnWriteArrayListReadMostlyDemo.java - 读多写少容器
- ConcurrentHashMapComputeDemo.java - compute 原子更新防超卖
- CyclicBarrierPhaserDemo.java - 多阶段协作
- CONCURRENCY_STUDY_MAP.md - 并发高级知识总图(已覆盖/待进阶)
项目使用Maven进行构建管理,需要Java 17环境。
mvn clean package该命令会生成两个jar包:
advancedJava-1.0-SNAPSHOT.jar- 普通jar包advancedJava-1.0-SNAPSHOT-jar-with-dependencies.jar- 包含所有依赖的uber-jar
首先运行目标应用程序:
java -cp target/advancedJava-1.0-SNAPSHOT.jar com.advancedjava.demo.AgentTest然后在另一个终端中运行Attach程序来动态加载Agent:
java -cp target/advancedJava-1.0-SNAPSHOT-jar-with-dependencies.jar com.advancedjava.demo.AttachMainjava -javaagent:target/advancedJava-1.0-SNAPSHOT-jar-with-dependencies.jar -cp target/advancedJava-1.0-SNAPSHOT.jar com.advancedjava.demo.AgentTestmkdir -p /tmp/record-demo-classes
javac -d /tmp/record-demo-classes \
src/main/java/com/advancedjava/interview/records/CandidateProfile.java \
src/main/java/com/advancedjava/interview/records/CandidateProfileClassic.java \
src/main/java/com/advancedjava/interview/records/InterviewResult.java \
src/main/java/com/advancedjava/interview/records/InterviewResultClassic.java \
src/main/java/com/advancedjava/interview/records/RecordDemoApp.java
java -cp /tmp/record-demo-classes com.advancedjava.interview.records.RecordDemoAppmkdir -p /tmp/record-test-classes
javac -d /tmp/record-test-classes \
-cp "$HOME/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar:$HOME/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar" \
src/main/java/com/advancedjava/interview/records/CandidateProfile.java \
src/main/java/com/advancedjava/interview/records/CandidateProfileClassic.java \
src/main/java/com/advancedjava/interview/records/InterviewResult.java \
src/main/java/com/advancedjava/interview/records/InterviewResultClassic.java \
src/test/java/com/advancedjava/interview/records/CandidateProfileTest.java
java -cp "/tmp/record-test-classes:$HOME/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar:$HOME/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar" \
org.junit.runner.JUnitCore com.advancedjava.interview.records.CandidateProfileTestmkdir -p /tmp/serialization-demo-classes
javac -d /tmp/serialization-demo-classes \
-cp "$HOME/.m2/repository/com/alibaba/fastjson2/fastjson2/2.0.60/fastjson2-2.0.60.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.17.1/jackson-databind-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.17.1/jackson-core-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.17.1/jackson-annotations-2.17.1.jar" \
src/main/java/com/advancedjava/interview/serialization/CandidatePayloadRecord.java \
src/main/java/com/advancedjava/interview/serialization/CandidatePayloadClassic.java \
src/main/java/com/advancedjava/interview/serialization/JsonSerializationDemoApp.java
java -cp "/tmp/serialization-demo-classes:$HOME/.m2/repository/com/alibaba/fastjson2/fastjson2/2.0.60/fastjson2-2.0.60.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.17.1/jackson-databind-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.17.1/jackson-core-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.17.1/jackson-annotations-2.17.1.jar" \
com.advancedjava.interview.serialization.JsonSerializationDemoAppmkdir -p /tmp/serialization-test-classes
javac -d /tmp/serialization-test-classes \
-cp "$HOME/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar:$HOME/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar:$HOME/.m2/repository/com/alibaba/fastjson2/fastjson2/2.0.60/fastjson2-2.0.60.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.17.1/jackson-databind-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.17.1/jackson-core-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.17.1/jackson-annotations-2.17.1.jar" \
src/main/java/com/advancedjava/interview/serialization/CandidatePayloadRecord.java \
src/main/java/com/advancedjava/interview/serialization/CandidatePayloadClassic.java \
src/test/java/com/advancedjava/interview/serialization/JsonSerializationExamplesTest.java
java -cp "/tmp/serialization-test-classes:$HOME/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar:$HOME/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar:$HOME/.m2/repository/com/alibaba/fastjson2/fastjson2/2.0.60/fastjson2-2.0.60.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.17.1/jackson-databind-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.17.1/jackson-core-2.17.1.jar:$HOME/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.17.1/jackson-annotations-2.17.1.jar" \
org.junit.runner.JUnitCore com.advancedjava.interview.serialization.JsonSerializationExamplesTestmkdir -p /tmp/framework-jdk-demo-classes
javac -d /tmp/framework-jdk-demo-classes \
src/main/java/com/advancedjava/interview/frameworks/jdk/RecordIntrospectionDemo.java
java -cp /tmp/framework-jdk-demo-classes \
com.advancedjava.interview.frameworks.jdk.RecordIntrospectionDemomkdir -p /tmp/framework-jdk-test-classes
javac -d /tmp/framework-jdk-test-classes \
-cp "$HOME/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar:$HOME/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar" \
src/main/java/com/advancedjava/interview/frameworks/jdk/RecordIntrospectionDemo.java \
src/test/java/com/advancedjava/interview/frameworks/jdk/RecordIntrospectionDemoTest.java
java -cp "/tmp/framework-jdk-test-classes:$HOME/.m2/repository/junit/junit/4.13.1/junit-4.13.1.jar:$HOME/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar" \
org.junit.runner.JUnitCore com.advancedjava.interview.frameworks.jdk.RecordIntrospectionDemoTestmkdir -p /tmp/concurrency-demo-classes
javac -d /tmp/concurrency-demo-classes \
src/main/java/com/advancedjava/interview/concurrency/*.java
java -cp /tmp/concurrency-demo-classes \
com.advancedjava.interview.concurrency.ConcurrencyFeatureShowcaseApp- Javassist 3.25.0-GA - 字节码操作库
- JUnit 4.13.1 - 单元测试框架
- JDK Tools - JVM工具类(用于动态attach到JVM进程)
- 项目使用Java 17编译,需要相应版本的JDK才能正常运行
- 动态Attach功能需要相应的权限设置
- 在不同操作系统上运行时可能需要调整部分系统相关的代码