reflection: Method/Field/MethodHandle/VarHandle demos, module and final-field rules (JEP 500 on JDK 26), JMH call-cost numbers, contract tests

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ic4b6NtPJHrkan4BXhCAM
This commit is contained in:
2026-11-08 18:14:04 +00:00
co-authored by Claude Sonnet 5.5
parent d7d5689f05
commit f6237d4117
19 changed files with 910 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
#!/usr/bin/env bash
# Regenerates every file in output/. Needs JDK 25 as JAVA_HOME; JDK26_HOME (optional) adds the
# JEP 500 comparison run. JMH takes a few minutes.
set -euo pipefail
cd "$(dirname "$0")/.."
mvn -q package
# env -u keeps the sandbox's JAVA_TOOL_OPTIONS banner out of committed output.
J() { env -u JAVA_TOOL_OPTIONS "$JAVA_HOME/bin/java" "$@"; }
echo "--- 01: basics ---"
{ echo '$ java -cp target/classes com.ankurm.reflection.ReflectionBasicsDemo'; echo
J -cp target/classes com.ankurm.reflection.ReflectionBasicsDemo 2>&1; } > output/01-basics.txt
echo "--- 02: module rules ---"
{ echo '$ java -cp target/classes com.ankurm.reflection.ModuleRulesDemo'; echo
J -cp target/classes com.ankurm.reflection.ModuleRulesDemo 2>&1
echo; echo '$ java --add-opens java.base/java.lang=ALL-UNNAMED -cp target/classes com.ankurm.reflection.ModuleRulesDemo'; echo
J --add-opens java.base/java.lang=ALL-UNNAMED -cp target/classes com.ankurm.reflection.ModuleRulesDemo 2>&1; } > output/02-module-rules.txt
echo "--- 03: final fields (JDK 25, and JDK 26 if JDK26_HOME is set) ---"
{ echo '$ java -cp target/classes com.ankurm.reflection.FinalFieldDemo # JDK 25'; echo
J -cp target/classes com.ankurm.reflection.FinalFieldDemo 2>&1
if [ -n "${JDK26_HOME:-}" ]; then
echo; echo '$ java -cp target/classes com.ankurm.reflection.FinalFieldDemo # JDK 26'; echo
env -u JAVA_TOOL_OPTIONS "$JDK26_HOME/bin/java" -cp target/classes com.ankurm.reflection.FinalFieldDemo 2>&1
echo; echo '$ java --illegal-final-field-mutation=deny -cp target/classes com.ankurm.reflection.FinalFieldDemo # JDK 26'; echo
env -u JAVA_TOOL_OPTIONS "$JDK26_HOME/bin/java" --illegal-final-field-mutation=deny -cp target/classes com.ankurm.reflection.FinalFieldDemo 2>&1 || true
fi; } > output/03-final-fields.txt
echo "--- 04: method handles ---"
{ echo '$ java -cp target/classes com.ankurm.reflection.MethodHandlesDemo'; echo
J -cp target/classes com.ankurm.reflection.MethodHandlesDemo 2>&1; } > output/04-method-handles.txt
echo "--- 05: JMH call cost (a few minutes) ---"
J -jar target/benchmarks.jar CallBenchmark -rf text -rff /tmp/jmh-reflection.txt > /tmp/jmh-reflection.log 2>&1
{ echo '$ java -jar target/benchmarks.jar CallBenchmark'; echo
J -version 2>&1 | head -1
echo; grep -A20 '^Benchmark ' /tmp/jmh-reflection.log | grep -v 'Benchmark result is saved'; } > output/05-call-benchmark.txt
echo "--- 06: single-file quick start ---"
{ echo '$ java src/main/java/com/ankurm/reflection/QuickStart.java'; echo
J src/main/java/com/ankurm/reflection/QuickStart.java 2>&1; } > output/06-quickstart.txt
echo done