====== 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