2012-10-26 5 views
0

스택 프레임을 통해 메소드 매개 변수에 액세스 할 수 있습니까?Java 스택 프레임 액세스

내가 작업 한 프로젝트 때문에이 필요성을 알게되었습니다. 예외가 발생하면 로깅을하고 싶습니다. 가능한 경우, "상위 레벨"에 도달 할 때까지 메서드의 이름과 매개 변수를 반복적으로 기록하려고합니다. 여기

작은 예입니다 -childMethod : PARAM1 값, PARAM2 부가가치 -parentMethod : PARAM1 부가가치

이 경우에 따라서

class Parent{ 

    public int parentMethod(int param1) { 
     String param2; 
     Child child = new Child(); 
     (...)some Work(...) 
     int ret = child.childMethod(param1, param2); 
     (...)some More Work(...) 
     return ret; 
    } 
} 


class Child{ 
    public int childMethod(int param1, String param2) { 
     (...) do more stuff (...) 
     try { 
      (...) this might generate an exception(...) 
     }catch(Exception e) { 
      (...) log method name and parameters value(...) 
     } 
    } 
} 

, 나는 같은 뭔가를 기록하고 싶습니다

+0

자녀가 "더 많은 일을 할 것"이라면 "param1 ++"는 어떻게 될까요? – leonbloy

+0

관련, 아마도 dup : http://stackoverflow.com/questions/4943612/java-how-to-get-arguments-passed-to-method-that-called-this-method – leonbloy

+0

@leonbloy - 중요합니까? 그것은 primitve이며, 값으로 복사합니다. –

답변

2

근본적인 문제가 있다고 생각합니다. 프리미티브 이외의 경우에는 참조 인이 전달됩니다. 따라서 메서드는 전달 된 매개 변수 값을으로 변경할 수 있습니다. 스택을 순회하는 것으로는이 문제가 해결되지 않습니다.

위 예제는 기본 요소와 변경 불가능한 객체를 사용합니다. 그러나 좀 더 일반적인 해결책이 필요하다고 생각합니다. 아마도 일종의 AOP 솔루션이 효과가 있을지 모르지만 메소드를 호출 할 때 (객체를 기록하기 위해) 객체를 복사해야하므로 슬픔의 세계를 생각하게됩니다.

+0

나는 모든 종류의 객체로 작업 할 수있는 일반적인 솔루션이 필요했기 때문에 프리미티브와 객체를 사용했습니다. 나는 그것이 "이해할 수 있고 이해할"필요는 없습니다. 예를 들어, 객체에서 param1에 이어 param1.toString()을 로그하면 문제가 없습니다. –

+0

귀하의 문제가 "이해하기 쉽고 이해하기 쉽다"고 생각하지 않습니다. 나는 그것이 "정확하고 원격으로 실용적"인 것과 관련이 있다고 생각합니다. –

+0

네, 맞습니다. 하지만 매개 변수 값이 변경되면 아무런 문제가 없습니다. 변경된 값만 기록 할 것입니다. 내가 제안한 것과 같이 할 수 있다면 문제는 실제 로깅입니다. –