Programming

Java에서 리플렉션을 통해 개인 필드에 액세스 할 수 있습니까?

procodes 2020. 8. 27. 22:24
반응형

Java에서 리플렉션을 통해 개인 필드에 액세스 할 수 있습니까?


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

메서드 에 전달해야합니다.


네 가능합니다.개인 필드의 이름과 함께 getField 메서드 대신 getDeclaredField 메서드를 사용해야합니다.

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

또한 비공개 필드에 액세스하려면이 필드에 액세스 할 수 있도록 설정해야합니다.

privateField.setAccessible(true);

완료되면 Field 인스턴스에서 get 메서드를 사용하여 str 필드의 값에 액세스 할 수 있습니다.참고 URL :

https://stackoverflow.com/questions/1555658/is-it-possible-in-java-to-access-private-fields-via-reflection

반응형