마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android reflect final 변경 문의 입니다.

0 추천

private final static boolean DBG = false;

안드로이드 lib의 정보를 reflect를 사용하여 DBG를 true 변경하고 싶습니다.


자바에서는 정상동작 되는 것을 확인 했는데 
안드로이드에서는 W/System.err(16261): java.lang.NoSuchFieldException: modifiers 에러가 발생합니다.

안드로이드에서 private final static 변수는 변경이 불가는한가요?

 

자바 코드 
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);

r기린ㄴㄴㄴ (460 포인트) 님이 2013년 2월 19일 질문
회색님이 2013년 2월 21일 태그 변경

2개의 답변

+1 추천
기본형(int, boolean, long, ... )이나 String 값의 경우 final static 으로 정의되면 Java에서 컴파일시간에 해당 변수가 사용된 곳들에 모두 상수로 치환되어 처리됩니다. 실제 실행시간에는 해당 변수들이 존재하지 않게 되기 때문에 reflection으로 변경할수 없습니다. 이 부분은 Java와 Android가 다른 부분은 아닌 것 같습니다.
회색 (21,340 포인트) 님이 2013년 2월 19일 답변
0 추천

private static final field. 는 java, 안드로이드에서 변경이 불가능합니다.

 

public static final field 는 가능합니다.

 

디버그 확인할경우 field값 변경은 되지만 출력은 안되는 현상이 존재 합니다.

 

r기린ㄴㄴㄴ (460 포인트) 님이 2013년 2월 19일 답변
reflection api에서 접근이 될지는 모르겠으나. public, private 상관없이 위에서 말씀드린대로 컴파일시간에 상수로 치환됩니다.  실제 저 상수를 가져다 쓰는 Class들이 저 변수를 참조하는게 아니라 모두 상수로 바뀌어서 컴파일 되기 때문에 그 값을 실행시간에 바꾸는 것이 그 값을 가져다 쓰는 Class들의 행동을 변화시키지는 못한다는 것은 알고 계셔야 합니다.
...