Возможно ли, что в Java можно получить доступ к приватной строке str посредством отражения? Например, чтобы получить значение этого поля.
class Test
{
   private String str;
   public void setStr(String value)
   {
      str = value;
   }
}
Возможно ли, что в Java можно получить доступ к приватной строке str посредством отражения? Например, чтобы получить значение этого поля.
class Test
{
   private String str;
   public void setStr(String value)
   {
      str = value;
   }
}
Да, это абсолютно так - если у вас есть соответствующие разрешения безопасности. Используйте 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);
    }
}
И нет, обычно вы не должны этого делать... это подрывает намерения автора оригинала. Например, вполне может быть применена валидация в любой ситуации, когда поле обычно может быть установлено, или другие поля могут быть изменены одновременно. Фактически вы нарушаете предполагаемый уровень инкапсуляции.
Да.
  Field f = Test.class.getDeclaredField("str");
  f.setAccessible(true);//Very important, this allows the setting to work.
  String value = (String) f.get(object);
Затем вы используете объект поля, чтобы получить значение в экземпляре класса.
Обратите внимание, что метод get часто путается для людей. У вас есть поле, но у вас нет экземпляра объекта. Вы должны передать это методу get
Да, это возможно.
Вам нужно использовать метод getDeclaredField (вместо метода getField) с именем вашего личного поля:
Field privateField = Test.class.getDeclaredField("str");
Кроме того, вам нужно установить это поле для доступа, если вы хотите получить доступ к закрытому полю:
privateField.setAccessible(true);
После этого вы можете использовать метод get в экземпляре Field, чтобы получить доступ к значению поля str.