【bug解决】getField抛出NoSuchFieldException详解

在使用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修饰的字段

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值