在使用java反射,去获取某对象的参数时,源码如下
对象:
public class OcrTempFacilityGuard extends OcrTemp{
/**
* 主键
*/
private Integer guardBarId;
//其他的省略
}
调用/出错部分:
@Test
public void testAnnotation() throws NoSuchFieldException {
Field id = OcrTempFacilityGuard.class.getField("guardBarId");
System.out.println(id);
}
运行时抛出异常
后来把 getFiled() 改为 getDeclaredField() 后,可以获取到参数。
然后深入了解了一下 getFiled() 和 getDeclaredField()
1.getFiled() 会在底层调用 getFiled0()
getFiled0() 方法会继续调用 searchFields(),进一步调用 privateGetDeclaredFields () 方法,并默认穿入一个true,看到这里可能就明白了,publicOnly为true,所以改方法返回的字段应该是public修饰的,但是我的字段是private修饰的,所以才会排除未找到当前字段的异常
2.同样方法,进入 getDeclaredField()方法,发现该方法底层也是调用searchFields(),进一步调用 privateGetDeclaredFields () 方法,但是这里穿入的参数是一个false,所以才可以访问到对象中private修饰的字段