为了账号安全,请及时绑定邮箱和手机立即绑定

是否有可能在Java中通过反射访问私有字段

是否有可能在Java中通过反射访问私有字段

慕田峪9158850 2019-07-26 17:15:52
是否有可能在Java中通过反射访问私有字段在Java中是否可以通过反射访问私有字段str?例如,获取此字段的值。class Test{    private String str;    public void setStr(String value)    {       str = value;    }}
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

是的,绝对是 - 假设您拥有适当的安全权限。使用Field.setAccessible(true)第一,如果你从不同的类访问它。

import java.lang.reflect.*;class Other{
    private String str;
    public void setStr(String value)
    {
        str = value;
    }}class Test{
    public static void main(String[] args)
        // Just for the ease of a throwaway test. Don't
        // do this normally!
        throws Exception
    {
        Other t = new Other();
        t.setStr("hi");
        Field field = Other.class.getDeclaredField("str");
        field.setAccessible(true);
        Object value = field.get(t);
        System.out.println(value);
    }}

不,你通常不应该这样做......它颠覆了班级原作者的意图。例如,可以在通常可以设置字段的任何情况下应用验证,或者可以同时更改其他字段。您实际上违反了预期的封装级别。


查看完整回答
反对 回复 2019-07-26
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

是。

  Field f = Test.class.getDeclaredField("str");
  f.setAccessible(true);//Very important, this allows the setting to work.
  String value = (String) f.get(object);

然后使用field对象获取类实例的值。

请注意,get方法通常会让人感到困惑。您有该字段,但您没有该对象的实例。你必须将它传递给get方法


查看完整回答
反对 回复 2019-07-26
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

对的,这是可能的。

您需要使用getDeclaredField方法(而不是getField方法),以及您的私有字段的名称:

Field privateField = Test.class.getDeclaredField("str");

此外,如果要访问私有字段,则需要将此字段设置为可访问:

privateField.setAccessible(true);

完成后,您可以在Field实例上使用get方法来访问str字段的值。


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 528 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信