2013-05-13 5 views
0

호출하는 메서드의 매개 변수 값을 가져 오는 방법은 무엇입니까?호출하는 메서드의 매개 변수 값 가져 오기

두 가지 클래스 즉, 클래스 A와 클래스 B는 두 가지 메소드 인 mthA (클래스 A)와 mthB (클래스 B)가있는 시나리오가 있습니다. mthA가 mthB를 호출합니다. 이제 mthB에서 모든 매개 변수가 mthA에 전달되었음을 알고 싶습니다. 기본적으로 예외 로깅 및 처리를위한 것입니다. 호출 클래스의 클래스 이름, 즉 클래스 A와 mthB 즉 mthA를 호출하는 메서드 이름을 가져올 수 있습니다. 그러나 mthA의 매개 변수를 얻는 데 막혔습니다. 이 나에게 호출하는 방법 즉 클래스 A.

Thread.currentThread().getStackTrace()[2].getMethodName() 

이 나에게 mthA 즉 호출하는 메소드의 메소드 이름을 제공의 클래스 이름을 제공

Thread.currentThread().getStackTrace()[1].getClassName() 

.

어떻게 든 전체 메서드 자체를 얻을 수 있다면 getParameters()를 사용하여이 메서드에 전달 된 메서드 매개 변수를 가져올 수 있습니다.

답변

0

가장 간단한 방법이 있거나 반사 ...를 사용해야 할 필요가 있습니까?

당신은 mthA 다음 mthB에도 전 같은 매개 변수를 전달을 위해 전달되는 매개 변수를 알고 싶다면 :

mthA(1stParam, 2ndParam, ...){ 
    mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);   
    ... 
} 
0

당신이 매개 변수를 변경할 수없는 경우 (메소드의 인수 값을 호출 얻을 수있는 쉬운 방법이 없습니다 호출 매개 변수 값을 포함하고 전달하는 메소드 호출).

Thread가 제공하는 API를 사용하여 클래스/메소드 이름과 같은 정적 정보를 얻을 수 있지만 인수 값과 같은 런타임 정보는 얻을 수 없습니다. 한 가지 방법은 이러한 정보를 어딘가에 저장하고 관리하고 로깅/예외의 경우 필요할 때 표시하는 것입니다. 나는 자바에 대한 API가 없다고 생각한다.

0

로깅 용도로만 사용되는 경우 mthA 자체에 로그인하여 메소드에 전달해야합니다.

mthB은 예외를 처리하는 데있어 mthA의 인수 값을 알고 있어야하는 이유는 무엇입니까? 그렇게한다면 코드를 리팩토링하고 예외를 적절한 수준에서 처리하는 것을 고려해야합니다. mthA에 전달 된 값이 예외로 이어지는 경우 mthB을 호출하기 전에 자체 처리해야합니다.

리플렉션은 클래스 및 메서드의 정적 정보를 가져 오는 데 도움이되며 메서드에 전달 된 인수의 런타임 값을 제공하지 않습니다.

+0

mthB는 methA를 다시 실행해야하므로 mthB는 methA로 전달 된 매개 변수를 알아야합니다. 내 시나리오에서 mthA가 실패하면 난 그저 그것을 해결하기 위해 잠자기 시간 이후에 다시 그 방법을 실행할 필요가있다. 따라서 mthA로 전달 된 매개 변수를 알고 다시 실행해야합니다. –

0

AspectJ와 같은 AOP 도구를 사용하여 이러한 값을 캡처하고 기록하지 않는 이유는 무엇입니까? after() advice와 함께 execution() point cut을 사용할 수있다. 프로덕션 이외의 배포의 경우 전달 된 값과 반환 된 값과 함께 모든 메서드 호출을 기록 할 수 있습니다. 이것은 생산 환경에 너무 많은 오버 헤드가 될 것입니다. 이를 위해서 여러분은 AspectJ advice에서 얻은 것과 같이 전달 된 값 (Object args [])을 로컬 변수에 저장하고 예외가 발생할 경우에만 기록 할 수 있습니다. 그러나이 경우조차도 원시 값이 Object []로 전달되도록 상자에 넣을 때 성능상의 불이익이있을 수 있습니다.

+0

안녕하세요 @ 아몰 글쎄 내가 AspectJ에 go 거렸다. 나는 그 것을 사용할 수 있다고 생각합니다. 하지만 이해할 수있는 몇 가지 좋은 예를 지적 할 수 있습니다. 어디에서나 내가 AspectJ가 스프링 프레임 워크와 함께 사용될 수 있다는 것을 발견했다. 하지만 난 봄 프레임 워크를 사용하지 않습니다. 내 것은 셀레늄 webdriver 프레임 워크입니다. 이 문맥에서 몇 가지 예를 지적 할 수 있습니다. –

관련 문제