我在第 3 方 JAR
中有一个设计不佳的类,我需要访问它的一个 私有 字段。例如,为什么我需要选择私有字段是否有必要?
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;
如何使用反射来获取 stuffIWant
的值?
原文由 Frank Krueger 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在第 3 方 JAR
中有一个设计不佳的类,我需要访问它的一个 私有 字段。例如,为什么我需要选择私有字段是否有必要?
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;
如何使用反射来获取 stuffIWant
的值?
原文由 Frank Krueger 发布,翻译遵循 CC BY-SA 4.0 许可协议
尝试来自 Apache commons-lang3 的 FieldUtils
:
FieldUtils.readField(object, fieldName, true);
PS 在我看来, 反射是邪恶的。
原文由 yegor256 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
为了访问私有字段,您需要从类的 声明 字段中获取它们,然后使其可访问:
编辑:正如 aperkins 所评论的那样,访问该字段,将其设置为可访问并检索该值都可以抛出
Exception
s,尽管您需要注意的唯一 检查 异常在上面评论。NoSuchFieldException
如果您请求一个名称与声明的字段不对应的字段,则会抛出该字段。IllegalAccessException
如果该字段不可访问(例如,如果它是私有的并且由于错过了f.setAccessible(true)
行而无法访问。The
RuntimeException
s which may be thrown are eitherSecurityException
s (if the JVM’sSecurityManager
will not allow you to change a field’s accessibility), orIllegalArgumentException
s,如果您尝试访问不是字段类类型的对象上的字段: