You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射获取字段值?求修正Hibernate监听器相关代码问题

修正Hibernate监听器反射代码的问题

嘿,我来帮你搞定这行反射代码的问题~先说说你这行代码的问题出在哪:

你写的CloudPersistable attachment = (CloudPersistable) f.get(f.getClass());有两个关键错误:

  1. Field.get(Object obj)方法需要传入的是持有该字段的对象实例,你传的f.getClass()是Field类的Class对象,这完全不对,应该传入你要获取字段值的那个对象——也就是外部的attachment实例。
  2. 你内部重新定义了attachment变量,和外部的FileAttachment实例重名了,这很容易造成代码混淆,建议换个变量名。

修正后的代码行

// 换个变量名避免冲突,同时传入正确的对象实例
CloudPersistable cloudPersistField = (CloudPersistable) f.get(attachment);

完整的修正后代码

我顺便把代码里多余的部分也优化了,比如你没必要重新加载Class对象:

public class Test {
    FileAttachment attachment = new FileAttachment();

    public Test() {
        attachment.setData(new byte[1]);
    }

    void test() throws Exception {
        for (Field field : attachment.getClass().getDeclaredFields()) {
            if (CloudPersistable.class.isAssignableFrom(field.getType())) {
                System.out.println("BOom");
                // 直接用attachment.getClass()就行,不用重新加载
                Field f = attachment.getClass().getDeclaredField("data");
                f.setAccessible(true);
                // 修正后的核心代码行
                CloudPersistable cloudPersistField = (CloudPersistable) f.get(attachment);
                System.out.println(cloudPersistField);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        new Test().test();
    }
}

额外说明

  • 反射获取字段值的时候,一定要给get()方法传入对应的对象实例,不然JVM不知道你要获取哪个对象的字段值。
  • 变量名尽量避免重复,尤其是在同一个作用域里,不然不仅容易混淆,还可能导致意外的变量覆盖问题。

内容的提问来源于stack exchange,提问作者Anas Fahumy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:03