2017-03-23 1 views
0

입력 다음 코드 디버깅 할 때 :하게 IntelliJ IDEA 디버그가있어서 여러 번

public class MyProxy { 
    public static void main(String[] args){ 

     Consumer f = (Consumer) Proxy.newProxyInstance(
       Consumer.class.getClassLoader(), 
       new Class[] { Consumer.class }, 
       new Handler(new ConsumerImpl()) 
     ); 

     f.consume("Hello"); // set breakpoint here 
     System.out.println("done"); 
    } 
} 

interface Consumer { 
    void consume(String s); 
} 

class ConsumerImpl implements Consumer { 
    public void consume(String s) { 
     System.out.println(s); 
    } 
} 

class Handler implements InvocationHandler { 
    private final Consumer original; 
    public Handler(Consumer original) { 
     this.original = original; 
    } 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws IllegalAccessException, IllegalArgumentException, 
      InvocationTargetException { 
     System.out.println("BEFORE"); 
     method.invoke(original, args); 
     System.out.println("AFTER"); 
     return null; 
    } 
} 

출력은 :

BEFORE 
AFTER 
BEFORE 
AFTER 
BEFORE 
BEFORE 
AFTER 
Hello 
BEFORE 
AFTER 
AFTER 
BEFORE 
AFTER 
BEFORE 
AFTER 
BEFORE 
AFTER 
BEFORE 
AFTER 
done 
BEFORE 
AFTER 

중단 점 라인에서 디버거 일시 정지, 출력이 L 개의 선이 언제, invoke 방법으로 들어가면 출력이 표시됩니다. 디버거가 매 단계마다 invoke 메소드를 입력하는 것과 같습니다. 왜냐하면 만약 내가이 방법을 사용하지 않으면 출력은 다음과 같습니다 :

BEFORE 
AFTER 
BEFORE 
Hello 
AFTER 
BEFORE 
AFTER 
done 
BEFORE 
AFTER 

코드를 실행하면 예상대로 출력됩니다.

BEFORE 
Hello 
AFTER 
done 

디버거의 버그입니까? 아니면 잘못된 것입니까?

봉투 : 윈도우 64, 인 IntelliJ의 IDEA, JDK8

답변

2

그것은 IDEA에서 버그가 아닙니다. 중단 점없이 디버깅하려고하면 예상 한 것과 동일한 결과를 얻을 수 있습니다. 그러나 중단 점을 입력하면 IDEA는 toString() 메서드를 호출 한 다음 평가할 수있는 변수의 hashCode() 메서드를 호출하려고 시도합니다.

궁극적으로 모든 메소드에서 InvocationHandler 구현을 호출합니다. "소비"메소드뿐만 아니라 method.getName()을 호출하여 호출 핸들러 구현에서이를 확인할 수 있습니다.

+0

나는 디버깅 할 때마다, 내가 할 때마다, 디버거가 (toString() 및 hashCode()를 호출하여 모든 변수를 재평가 할 것이다. 2.'invoke' 메쏘드에서 단계별로'this'가 평가되어'main()'에서'f'를 평가하는 것과 같은 효과를냅니다. – matrix

+0

'method.getName()'으로 테스트 한 결과,'toString()'이 호출되어'hashCode()'는 평가되지 않습니다. – matrix

+0

예, 귀하의 경우에는 toString() 메소드 일뿐입니다. 내 대답의 첫 번째 단락은 일반적인 경우 (toString()을 재정의하지 않은 경우) 일반 클래스의 경우 toString() 메서드를 통해 hashCode 메서드가 실행됩니다. 내 대답은 다소 hasCode 메서드에 대해 불분명하다고 생각합니다. – hunter

관련 문제