问题:
今天针对B类写反射的一些方法时 出现了一个异常 如下:
java.lang.NoSuchFieldException: id at java.lang.Class.getDeclaredField(Class.java:2070) at test.FuncNAME(test.java:51)
可以看到是 "没有这样的字段异常" , 触发异常的代码是这样的:
B b = new B(); Field fruit = b.getClass().getDeclaredField("id");
B类定义如下:
@Data public class B extends A { }
A类定义如下:
public class A { String id; }
解决bug耗时: 20分钟
原因和解决方式:
id字段并不是B类直接定义的 虽然它继承了A类 但是还是反射不出来的 如果要反射出来 必须这样写反射语句
Field fruit = b.getClass().getSuperclass().getDeclaredField("id");
也就是加上一个 .getSuperclass() --> 再次获取到父类的类对象
同理 如果现在有个C类定义如下:
@Data public class C extends B { }
那么代码就要这样写:
Field fruit = b.getClass().getSuperclass().getSuperclass().getDeclaredField("id");
结束;