JAVA

[Java] Relection 메소드 필드명 가져오기 arg0, arg1

코카멍멍 2024. 4. 28. 00:33
반응형

메소드 필드명이 필요했던 이유

AOP를 이용해 다양한 곳에서 유연하고 범용성 있게 사용하기 위해 메소드의 매개변수 필드명이 필요했습니다.

Reflection 메소드 매개변수 필드명 가져오기

해당 log에서 원하는 출력 값은 lockNameuserId의 값이였습니다.

Parameter.getName()

하지만 예상했던 것과는 다르게 arg0, arg1 과 같은 변수명을 가져왔습니다.
그래서 저는 왜 이런 값을 가져오는지 내부 메소드를 확인해봤습니다

클래스 구조도

Method클래스는 Executable 클래스를 상속하고 있고 getParameters는 Executable클래스에서 구현되어 있었습니다

Executable

getParameters 메소드(시작)

privateGetParameters 메소드

|300

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