사용자 도구

사이트 도구


java:reflection

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:reflection [2014/09/28 13:53]
kwon37xi
java:reflection [2023/11/30 14:53] (현재)
kwon37xi
줄 1: 줄 1:
 ====== Java Reflection ====== ====== Java Reflection ======
   * [[http://tutorials.jenkov.com/java-reflection/index.html|Java Reflection Tutorial]]   * [[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 ===== ===== Accessing Private Field =====
줄 31: 줄 38:
  
 ===== Class.isAssignableFrom() ===== ===== Class.isAssignableFrom() =====
-  * ''A.class.isAssignableFrom(B.class)''는 ''A a = new B()''가 가능한지를 묻는 것이라고 보면된다.<code java>+''A.class.isAssignableFrom(B.class)''는 ''A a = new B()''가 가능한지를 묻는 것이라고 보면된다. 
 +<code java>
 assertThat(Serializable.class.isAssignableFrom(String.class)).isTrue(); assertThat(Serializable.class.isAssignableFrom(String.class)).isTrue();
 assertThat(String.class.isAssignableFrom(Serializable.class)).isFalse(); assertThat(String.class.isAssignableFrom(Serializable.class)).isFalse();
 </code> </code>
 +
 +===== 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]]
 +
 +<code java>
 +
 +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
 +</code>
 +
java/reflection.1411880025.txt.gz · 마지막으로 수정됨: 2014/09/28 13:53 저자 kwon37xi