Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_017ic4b4VQVEJWetTT1dYzyJ
2.4 KiB
2.4 KiB
classfile-api
Companion code for the ankurm.com article The Java ClassFile API (JEP 484): Read, Generate and Transform Bytecode Without ASM (https://ankurm.com/java-classfile-api-jep-484/).
java.lang.classfile was a preview API in JDK 22 and 23 (JEPs 457, 466) and is final since JDK 24 (JEP 484): no --enable-preview.
Everything here ran on Temurin 25.0.5+8; the API diff also ran on Temurin 24.0.2 and 26.0.2.1. The only dependency is ASM 9.11.1, used by the comparison classes.
| File | What it shows | Output |
|---|---|---|
Target.java, Timings.java |
the class we inspect/instrument, and the sink the injected code calls | |
ParseDemo.java |
ClassFile.of().parse, ClassModel traversal, pattern-matching over elements and instructions |
output/01-parse.txt |
GenerateDemo.java |
ClassFile.build, verify, Lookup.defineClass vs defineHiddenClass |
output/02-generate.txt, 03-javap-generated.txt |
BrokenGenerate.java |
dropped stack maps, wrong return type, stack underflow, swapped exception-table labels | output/04-broken-generate.txt |
TimingTransform.java, TransformDemo.java |
ClassTransform / MethodTransform / CodeTransform inserting timing; naive vs exception-safe |
output/05-transform.txt, 06-javap-instrumented.txt |
AsmParse.java, AsmGenerate.java, AsmInstrument.java, AsmGotcha.java |
the same three jobs in ASM 9.11.1, asserted equal; plus the EXPAND_FRAMES trap |
output/08, 09, 10, 15 |
VersionLimits.java |
a newer class file than the reader knows: java.lang.classfile vs ASM |
output/11-version-limits.txt |
Bench.java |
indicative parse and copy timing on 2000 java.base classes (thread CPU time, noisy) |
output/13-bench.txt |
scripts/run-all.sh |
API diff of java.lang.classfile across JDK 24, 25, 26 |
output/07-api-diff-24-25-26.txt |
scripts/spring-core-probe.sh |
what spring-core 7.0.10 ships for the ClassFile API |
output/14-spring-core-probe.txt |
JDK25=/path/to/jdk-25 JDK24=/path/to/jdk-24 JDK26=/path/to/jdk-26 ./scripts/run-all.sh # JDK24/JDK26 optional; needs Maven for the ASM jars
JDK25=/path/to/jdk-25 ./scripts/spring-core-probe.sh
The demos assert as they go (PASS/FAIL, non-zero exit on failure), like the other standalone modules; there is no JUnit. Output is byte-stable except 13-bench.txt.
Not reproduced: nothing was run on JDK 22/23 previews.