java 反射私有字段_是否有可能在Java中通过反射访问私有字段[重复]

问题

这个问题在这里已有答案:

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

在Java中是否可以通过反射访问私有字段str?例如,获取此字段的值。

class Test

{

private String str;

public void setStr(String value)

{

str = value;

}

}

#1 热门回答(167 赞)

是的,绝对是 - 假设你已获得适当的安全权限。如果你从其他班级访问它,请首先使用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);

}

}

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

#2 热门回答(45 赞)

是。

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方法

#3 热门回答(5 赞)

对的,这是可能的。

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

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

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

privateField.setAccessible(true);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值