猿问

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

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

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

class Test{
   private String str;
   public void setStr(String value)
   {
      str = value;
   }}


慕田峪9158850
浏览 529回答 3
3回答

斯蒂芬大帝

是的,绝对是 - 假设您拥有适当的安全权限。使用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);     }}不,你通常不应该这样做......它颠覆了班级原作者的意图。例如,可以在通常可以设置字段的任何情况下应用验证,或者可以同时更改其他字段。您实际上违反了预期的封装级别。

慕哥9229398

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

凤凰求蛊

对的,这是可能的。您需要使用getDeclaredField方法(而不是getField方法),以及您的私有字段的名称:Field privateField = Test.class.getDeclaredField("str");此外,如果要访问私有字段,则需要将此字段设置为可访问:privateField.setAccessible(true);完成后,您可以在Field实例上使用get方法来访问str字段的值。
随时随地看视频慕课网APP

相关分类

Java
我要回答