티스토리 툴바


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

IT/Java 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 is call me?");

System.out.println( e.getStackTrace()[1].getClassName() + " " +
e.getStackTrace()[1].getMethodName() );
// StackTrace의 '1'번 인덱스를 가져오면 바로 상위 호출자를 가르키게 된다. 

}



저작자 표시 비영리 동일 조건 변경 허락

설정

트랙백

댓글

한글 유니코드로 변환하기

IT/Java 2010/11/23 15:28
public String convert(String str) {
    StringBuffer ostr = new StringBuffer();
    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

         // 유니코드로 변환할 필요가 있는 문자열인지 판단
         if ((ch >= 0x0020) && (ch <= 0x007e)) { 
             ostr.append(ch); // 아닌 경우.
         } else { // 변경해야 하는 경우.
             ostr.append("\\u");
             String hex = Integer.toHexString(str.charAt(i) & 0xFFFF); // 문자의 Hex 값
      
             // 네 자리를 맞추기 위해 0 추가
             for (int j = 0; j < 4 - hex.length(); j++)
                 ostr.append("0");
 
             ostr.append(hex.toLowerCase());
        }
    }
    return (new String(ostr));
}

'에러'라는 글자를 인자로 주면 '\uc5d0\ub7ec'라는 결과로 반환해준다. 

[출처 : http://www.daniweb.com/forums/thread147397.html]

이 글은 스프링노트에서 작성되었습니다.

저작자 표시 비영리 동일 조건 변경 허락

설정

트랙백

댓글

정규식 특수문자 사용하기

IT/Java 2010/11/19 16:14

 Java로 String Parser를 구현하는 중에 특수문자를 치환해줘야하는 경우가 발생했다. 정규식에서 사용하는 정규 문자들을 치환(String.replaceAll 메소드 사용)해줘야 했었는데, 정규식에서는 특수문자를 정규식의 패턴으로 인식해서 에러(java.util.regex.PatternSyntaxException)가 발생하였다. 이러한 방법을 해결해주기 위해 치환할 때 아래와 같이 표현해주면 된다.
 

  1. []으로 싸줘야하는 문자
    * → [*]
    + → [+]
    $ → [$]
    | → [|]

  2. \\ 추가 해야하는 문자
    ( → \\(
    ) → \\)
    { → \\{
    } → \\}
    ^ → \\^
    [ → \\[
    ] → \\]

  3. 무관한 특수 문자
    ! # % & @ ` : ; - . < > , ~ ' "

이 글은 스프링노트에서 작성되었습니다.

저작자 표시 비영리 동일 조건 변경 허락

설정

트랙백

댓글

프록시 패턴을 이용한 메소드 접근 제어에 대한 연구

IT/Java 2010/04/20 01:20

 주제가 갑자기 바뀌 논문. "프록시 패턴을 이용한 메소드 접근 제어". 이차저차 했지만, 뭐 조금 은 나온 것 같다. 아직 갈 길이 멀다.

 

설정

트랙백

댓글

SerialVersionUID in Serializable Interface

IT/Java 2010/01/12 09:43
 Servlet을 구현하다가 보면, Warning 항목이 위와 같이 뜨면서, SerialVersionUID를 작성하라고 한다. 지금까지 작업을 할 때에는, 그저 무시하고 말았었는데, 웹 서비스가 실행되다가 InvalidClassException이 발생할 가능성이 있다고 한다.

 Java API에는 다음과 같이 명시되어 있다.

 직렬화 가능(Serializable) 클래스가 serialVersionUID를 명시적으로 선언하지 않는 경우, 직렬화 런타임은 「Java(TM) 객체 직렬화 스펙」에서 설명하고 있듯이, 클래스의 다양한 측면에 근거해, 클래스의 serialVersionUID의 Default 값를 계산한다. 다만, 모든 직렬화 가능 클래스가 serialVersionUID를 명시적으로 선언하는 것을 강하게 추천한다. Default의 serialVersionUID 계산이, 컴파일러의 구현에 따라서, 다를 가능성이 있는 클래스의 영향을 받기 쉽고, 직렬화 복원 중에 예기치 않은 InvalidClassException 가 발생할 가능성이 있기 때문이다. 따라서, java 컴파일러의 구현이 달라도 serialVersionUID의 일관성을 확보로 하려면, 직렬화 가능 클래스가 serialVersionUID를 명시적으로 선언하지 않으면 안된다. 또, serialVersionUID 의 명시적인 선언에서는 private 수식자를 사용하는 것을 적극 추천한다. 이러한 선언은 직접적으로 선언하는 클래스에게만 적용되게 하기 위한 것이다. private으로 선언하면, serialVersionUID 필드를 상속되는 멤버와 같이 사용하지 않는다.


 많은 개발자들이 InvalidClassException으로 질문을 게시하는 경우가 종종 있다. 원인 파악을 못하는 경우가 있었는데, 이와 같이 간단한 사항을 준수한다면, 예외발생이 적은, 좋은 프로그램이 되겠다.

설정

트랙백

댓글