DRUNKEN KEVIN

메소드를 호출한 클래스/메소드 알아내는 방법

2011.09.27 11:19

가상


 큰 규모의 프로젝트를 하다보면, 내가 작성한 메소드를 누군가 호출을 하게 된다. 그런데, 어떤 메소드가 호출을 할 때에는 정상 작동을 하면서도, 또 다른 메소드가 호출을 하면 에러가 발생하는 경우가 있다. 심지어 프로젝트가 너무 복잡해서 어떤 메소드가 호출을 했을 때 에러가 발생하는지 알 수 없을 때도 있다. 사실 이 코드는 에러를 잡는다기 보단,(Parameter에 관련된 Log를 찍어 디버깅이 충분히 가능하다.) 누가 나를 잘못 호출하는 지 알아낼 수 있는, 에러 유발자를 찾는 코드라고 할 수 있다. (동료의 요청으로 한번 짜보았다.)


 일단, 기본 아이디어는 다음과 같다. Thread 혹은 Stack을 이용해보자. Thread를 사용하기는 애매할 것 같고, Exception 발생시 확인할 수 있는 Stack을 사용하기로 했다. Exception 클래스의 printStackTrace() 메소드 쯤은 누구나 다 한번 사용해 봤을 것이다. 혹은 런타임 에러가 발생했을 때, 아래와 같은 메시지를 본 적이 있을 것이다.


java.lang.Exception
at net.kevinx64.util.knowcaller.Callee.func(Callee.java:6)
at net.kevinx64.util.knowcaller.Caller3.m3(Caller3.java:5)
at net.kevinx64.util.knowcaller.KnowCallerTest.main(KnowCallerTest.java:7)


  여기에 보면, 어떤 에러가 발생했는지(java.lang.Exception)와,누가 호출해서 에러가 발생했는지 최초 지점까지 추적해준다. 바로 이것을 통해서 아래와 같이 나를 호출한 클래스, 메소드를 알아내는 코드를 작성해보았다. 혹시나, 글의 처음에 언급했듯이, 에러 유발자를 찾으려 할 때 참고하시길 바란다.


try{
throw new Exception();
}catch(Exception e){
System.out.println("Who did call me?");
System.out.println( e.getStackTrace()[1].getClassName() + " " +
e.getStackTrace()[1].getMethodName() );
// StackTrace의 '1'번 인덱스를 가져오면 바로 상위 호출자를 가르키게 된다.