사용자 도구

사이트 도구


java:reflection

Java Reflection

Field/Method 선언 순서

  • 필드와 메소드의 선언 순서대로 리플렉션에서 값을 읽을 수 없다.
  • JDK 6 부터 Reflection 에서 field/method 순서에 따라 응답을 주기는 하고 있으며, 이후 버전도 이런 기조를 유지하고는 있으나 reflection API에서는 이 순서에 대해 명시하지 않고 있고, 따라서 이 순서가 변경될 가능성이 존재하는 것도 사실이다. 그러나 그런일이 없을 거라고 예상한다.

Accessing Private Field

PrivateObject privateObject = new PrivateObject("The Private Value");
 
Field privateStringField = PrivateObject.class.
            getDeclaredField("privateString");
 
privateStringField.setAccessible(true);
 
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Accessing private method

PrivateObject privateObject = new PrivateObject("The Private Value");
 
Method privateStringMethod = PrivateObject.class.
        getDeclaredMethod("getPrivateString", null);
 
privateStringMethod.setAccessible(true);
 
String returnValue = (String)
        privateStringMethod.invoke(privateObject, null);
 
System.out.println("returnValue = " + returnValue);

Class.isAssignableFrom()

A.class.isAssignableFrom(B.class)A a = new B()가 가능한지를 묻는 것이라고 보면된다.

assertThat(Serializable.class.isAssignableFrom(String.class)).isTrue();
assertThat(String.class.isAssignableFrom(Serializable.class)).isFalse();

private static final 필드 읽기/변경

class MyClass4 {
 
    private static final Boolean enabled = Boolean.FALSE; // 읽고 변경할 대상 필드
 
    public static Boolean getEnabled() {
        return enabled;
    }
}
 
// "enabled" 필드 인스턴스 확보
Field field = MyClass4.class.getDeclaredField("enabled");
field.setAccessible(true); // Suppress Java language access checking
 
// "final" modifier 제거
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
 
// 값 읽기
Boolean fieldValue = (Boolean) field.get(null);
System.out.println(fieldValue); // -> false
 
// 값 쓰기
field.set(null, Boolean.TRUE);
System.out.println(MyClass4.getEnabled()); // -> true
java/reflection.txt · 마지막으로 수정됨: 2023/11/30 14:53 저자 kwon37xi