如何通过反射获取字段值?求修正Hibernate监听器相关代码问题
修正Hibernate监听器反射代码的问题
嘿,我来帮你搞定这行反射代码的问题~先说说你这行代码的问题出在哪:
你写的CloudPersistable attachment = (CloudPersistable) f.get(f.getClass());有两个关键错误:
Field.get(Object obj)方法需要传入的是持有该字段的对象实例,你传的f.getClass()是Field类的Class对象,这完全不对,应该传入你要获取字段值的那个对象——也就是外部的attachment实例。- 你内部重新定义了
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
相关产品推荐
相关产品推荐

