Is it possible in Java to access private fields via reflection

Volodymyr Bezuglyy picture Volodymyr Bezuglyy · Oct 12, 2009 · Viewed 135.1k times · Source

Is it possible in Java to access private field str via reflection? For example to get value of this field.

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

Answer

Jon Skeet picture Jon Skeet · Oct 12, 2009

Yes, it absolutely is - assuming you've got the appropriate security permissions. Use Field.setAccessible(true) first if you're accessing it from a different class.

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);
    }
}

And no, you shouldn't normally do this... it's subverting the intentions of the original author of the class. For example, there may well be validation applied in any situation where the field can normally be set, or other fields may be changed at the same time. You're effectively violating the intended level of encapsulation.