如何从 Java 中的不同类读取私有字段的值?

新手上路,请多包涵

我在第 3 方 JAR 中有一个设计不佳的类,我需要访问它的一个 私有 字段。例如,为什么我需要选择私有字段是否有必要?

 class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

如何使用反射来获取 stuffIWant 的值?

原文由 Frank Krueger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

为了访问私有字段,您需要从类的 声明 字段中获取它们,然后使其可访问:

 Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException

编辑:正如 aperkins 所评论的那样,访问该字段,将其设置为可访问并检索该值都可以抛出 Exception s,尽管您需要注意的唯一 检查 异常在上面评论。

NoSuchFieldException 如果您请求一个名称与声明的字段不对应的字段,则会抛出该字段。

 obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException

IllegalAccessException 如果该字段不可访问(例如,如果它是私有的并且由于错过了 f.setAccessible(true) 行而无法访问。

The RuntimeException s which may be thrown are either SecurityException s (if the JVM’s SecurityManager will not allow you to change a field’s accessibility), or IllegalArgumentException s,如果您尝试访问不是字段类类型的对象上的字段:

 f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type

原文由 oxbow_lakes 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题