【Java反射】getDeclaredField(String name) 和 getField(String name)区别

getDeclaredField(String name)getField(String name) 都是Java反射API中用于获取类字段(成员变量)的方法,但它们之间存在一些关键的区别:

getDeclaredField(String name)

  • 功能:这个方法返回的是声明在该类中的指定名称的字段,包括私有、受保护、默认(包访问权限)和公有字段,不论该字段是在哪个类中声明的。也就是说,它会查找该类声明的所有字段,包括那些从超类继承来的字段(但注意,它返回的是当前类中声明的同名字段,而不是超类的字段)。
  • 访问权限:即使字段是私有的,通过调用setAccessible(true),也能访问到这个字段。
  • 异常:如果找不到指定名称的字段,会抛出NoSuchFieldException

getField(String name)

  • 功能:这个方法返回的是公共(public)的字段,并且这个字段必须是在当前类或其父类中声明的(直接可访问的,不包括私有字段)。它只查找公共字段,不会查找私有、受保护或默认访问级别的字段。
  • 访问权限:由于它只能获取公共字段,所以不需要特别设置访问权限。
  • 异常:如果找不到指定名称的公共字段,同样会抛出NoSuchFieldException

区别总结

  • 访问范围getDeclaredField能够访问到类中声明的所有字段(包括私有的),而getField仅能访问公共字段。
  • 继承性getField会查找当前类及其父类中声明的公共字段,而getDeclaredField虽然也能看到父类字段(但返回的是当前类中声明的同名字段,如果有),但它主要关注的是当前类的声明。
  • 使用场景:如果你需要访问包括私有字段在内的所有字段,应该使用getDeclaredField。如果你只需要访问和操作公共字段,使用getField更合适。

在实际应用中,根据需要访问的字段的可见性和位置(是否在当前类中直接声明),你会选择使用其中之一。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRE_MO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值