반응형
메소드 필드명이 필요했던 이유
AOP를 이용해 다양한 곳에서 유연하고 범용성 있게 사용하기 위해 메소드의 매개변수 필드명이 필요했습니다.
Reflection 메소드 매개변수 필드명 가져오기
해당 log에서 원하는 출력 값은 lockName
과 userId
의 값이였습니다.
Parameter.getName()
하지만 예상했던 것과는 다르게 arg0
, arg1
과 같은 변수명을 가져왔습니다.
그래서 저는 왜 이런 값을 가져오는지 내부 메소드를 확인해봤습니다
클래스 구조도
Method클래스는 Executable 클래스를 상속하고 있고 getParameters
는 Executable클래스에서 구현되어 있었습니다
Executable
getParameters 메소드(시작)
privateGetParameters 메소드
tmp가 초기화 되는 로직은 이 로직에서 밖에 이뤄지지 않습니다. 그래서 처음에는 synthesizeAllParams() 메소드를 타게 됩니다
synthesizeAllParams 메소드
이 전에 parameters를 초기화 해주는 곳이 없어서 발생하는 문제입니다.
무조건 synthesizeAllParams() 메소드로 통해 arg0, arg1으로 초기화 되는 것입니다.
해결방법
컴파일단에서 옵션을 추가해주면 위와 같은 문제를 해결할 수 있습니다. 그렇게 되면 컴파일이 동작할 때 class 파일에 변수명이 저장되기 때문에 null이 아닌 실제값이 존재해서 synthesizeAllParams
메소드가 아니라 verifyParameters
메소드를 타게 되어 실제 변수명을 가져올 수 있는 것이죠
Intellij로 실행을 한다면 빌드 - Java 컴파일러 - 매개변수에 -parameters
를 추가하면 됩니다.
Gradle 컴파일 옵션 추가
만약 gradle로 실행한다면 위와 같은 코드를 추가해서 컴파일러 옵션을 넣어줄 수 있습니다
반응형
'JAVA' 카테고리의 다른 글
[Java] TreeSet의 구조와 주의사항 (0) | 2024.02.29 |
---|---|
[JAVA] 다 쓴 객체 참조를 해제하라 (0) | 2023.12.20 |
[Java] 동적 프록시에 대해 (0) | 2023.11.28 |
[JAVA] GC란? (0) | 2023.11.09 |
정적 팩토리 메소드의 장단점 (0) | 2023.07.07 |