final 키워드가 붙은 변수를 리플랙션을 통해 변경하는법을 알아봅니다.
static final 키워드도 변경이 가능한지 확인해봅니다.
Goal
- 런타임에 설정된 final 키워드가 붙은 변수를 리플랙션을 통해 변경하는법을 알아봅니다.
- static final 의 경우에도 변경이 가능한지 확인해봅니다.
How
1 |
|
예시
1 |
|
new UserName("jys")
단계에서 jys로 설정되었던 value값이 unluckyjung으로 변경되어 테스트를 통과하는것을 확인하실 수 있습니다.
예시2
컴파일타임때 결정된 final 값은 변경되지 않습니다.
1 |
|
- 위와 같이 value 값을 객체 생성때 넣어주는것이 아니고, 인스턴스 값을 미리 정해둔다면 변경되지 않습니다.
예시 2.1 final를 제거하는 경우
1 |
|
- 위와같이
final
키워드를 제거해주는 경우에는 값 변경에 성공합니다.
static final 도 가능합니다.
- 런타임 타임때 설정된
static final
형태도 변경이 가능합니다. (하지만 이런 경우가 필요한 상황은 굉장히 드뭅니다)
1 |
|
- StackOverflow 에서 가져온 예시
- false가 아니라, true가 출력되는것을 확인할 수 있습니다.
Conclusion
- 런타임때 설정된
final
키워드가 붙은 변수값을reflection
을 통해 변경할 수 있다. - 런타임때 설정된
static final
값인 경우에도 변경이 가능하다. - 하지만 final 이 붙은 값을 무작정 바꾸려고 하기보다는, 바꾸려는 상황이 맞는지, 설계에 문제가 있는것이 아닌지를 먼저 고려해보자.
Code
- 해당 코드들은 전부 github에서 보실 수 있습니다.