JDK26的JEP 500属性

前言

JDK26的JEP 500属性,为未来"final 真正不可变"做准备,通过深度反射修改 final 字段将触发运行时警告

使用例子

csharp 复制代码
public class FinalFieldDemo {

    // 常量表达式初始化: javac 把读取折叠成 ldc "original", 反射改完普通读取仍是旧值
    private final String name = "original";

    // 非常量表达式初始化: 编译成 getfield, 反射改完普通读取能看到新值
    private final String tag = new String("original");

    public static void main(String[] args) throws Exception {
        FinalFieldDemo demo = new FinalFieldDemo();

        System.out.println("=== 修改前 ===");
        System.out.println("  直接读 name = " + demo.name);
        System.out.println("  直接读 tag  = " + demo.tag);

        // 深反射改 final: JDK 26 默认 warn 模式下写入成功, 仅在 stderr 打印一次 WARNING
        Field nameField = FinalFieldDemo.class.getDeclaredField("name");
        nameField.setAccessible(true);
        Field tagField = FinalFieldDemo.class.getDeclaredField("tag");
        tagField.setAccessible(true);

        System.out.println("=== 修改后 ===");
        System.out.println("  写 name = " + write(nameField, demo, "hacked-name"));
        System.out.println("  反射读 name = " + nameField.get(demo) + "   <- 反射读到的才是真实内存值");
        System.out.println("  直接读 name = " + demo.name + "   <- 编译期 ldc 折叠, 看不到运行时改写");
        System.out.println("  写 tag  = " + write(tagField, demo, "hacked-tag"));
        System.out.println("  反射读 tag  = " + tagField.get(demo));
        System.out.println("  直接读 tag  = " + demo.tag + "   <- 真实 getfield, 与反射读一致");
    }

    /**
     * 写入 final 字段, 返回写入结果描述。
     * warn 模式(默认): 写入成功 + stderr 打印 WARNING;
     * deny 模式(未来 JDK 默认): 抛 IllegalAccessException
     * "unnamed module @xxx is not allowed to mutate final fields"。
     */
    private static String write(Field field, Object target, Object value) {
        try {
            field.set(target, value);
            return "成功";
        } catch (IllegalAccessException e) {
            return "被拒绝 -> " + e.getMessage();
        }
    }
}

输出结果为

总计

修改final值会发出警告,但是还是能修改成功

相关推荐
LMT流氓兔1 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n1 小时前
【JUC】四种内存屏障示例
java·1024程序员节
Mia_墨黎2 小时前
2026 Windows 11 终端美化完全指南
前端·后端
foreverYoung2 小时前
给开源后台做等保适配,我发现了 5 个"看起来有、其实没用"的功能 从一个尴尬的现场测试说起
后端
程序猿阿越2 小时前
从 StatefulSet 到容器挂载:CSI 源码走读
后端·kubernetes·源码阅读
苏三说技术2 小时前
继PHP之后,Java也爆出了重大安全漏洞!
后端
念何架构之路2 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo73 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java
Percep_gan3 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节