- Published on
JDK 26(2026년 3월 17일 GA)은 JEP 500 "Prepare to Make Final Mean Final"을 통해, 딥 리플렉션으로 final 필드를 재할당하는 코드에 런타임 경고를 띄우기 시작했습니다. JDK 5 이후로 setAccessible(true) 다음의 Field.set()은 final 필드를 마음대로 바꿀 수 있었고, Gson 같은 역직렬화 라이브러리와 필드 주입 DI가 그 위에 통째로 올라가 있습니다. 지금 기본값은 warn이라 동작은 그대로지만, 장래 릴리스에서 deny가 기본이 되면 IllegalAccessException으로 바뀝니다. 이 글은 JEP 500이 정확히 무엇을 바꿨는지(Field::set에 붙은 새 조건 두 개, 새 플래그 두 개), Gson·Spring Security·Trino·Lucene의 실제 이슈에서 무엇이 걸렸는지, deny와 JFR 이벤트로 범인을 찾는 방법, 그리고 sun.reflect.ReflectionFactory가 Serializable 클래스에만 통하는 반쪽짜리 탈출구인 이유를 정리합니다. 성능 이득은 JEP가 "잠재적으로 더 빠르다"고만 말할 뿐 수치를 내놓지 않았고, JDK 27은 이미 기능 동결 상태에서 관련 JEP가 없다는 점 — 즉 지금 당장 터지는 불은 아니라는 점도 같이 짚습니다.