====== Java Reflection ======
* [[http://tutorials.jenkov.com/java-reflection/index.html|Java Reflection Tutorial]]
* [[http://www.javacodegeeks.com/2014/11/java-reflection-api-tutorial.html|Java Reflection API Tutorial]]
===== Field/Method 선언 순서 =====
* 필드와 메소드의 선언 순서대로 리플렉션에서 값을 읽을 수 없다.
* JDK 6 부터 Reflection 에서 field/method 순서에 따라 응답을 주기는 하고 있으며, 이후 버전도 이런 기조를 유지하고는 있으나 reflection API에서는 이 순서에 대해 명시하지 않고 있고, 따라서 이 순서가 변경될 가능성이 존재하는 것도 사실이다. 그러나 그런일이 없을 거라고 예상한다.
* [[https://coderedirect.com/questions/143527/java-reflection-getting-fields-and-methods-in-declaration-order|[Solved] Java Reflection: Getting fields and methods in declaration order - Code Redirect]]
===== 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 필드 읽기/변경 =====
* [[https://javahowtodoit.wordpress.com/2014/09/12/how-to-get-and-set-private-static-final-field-using-java-reflection/|How to get and set private static final field using Java reflection | Java: How To Do It]]
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