입력 다음 코드 디버깅 할 때 :하게 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
이
나는 디버깅 할 때마다, 내가 할 때마다, 디버거가 (toString() 및 hashCode()를 호출하여 모든 변수를 재평가 할 것이다. 2.'invoke' 메쏘드에서 단계별로'this'가 평가되어'main()'에서'f'를 평가하는 것과 같은 효과를냅니다. – matrix
'method.getName()'으로 테스트 한 결과,'toString()'이 호출되어'hashCode()'는 평가되지 않습니다. – matrix
예, 귀하의 경우에는 toString() 메소드 일뿐입니다. 내 대답의 첫 번째 단락은 일반적인 경우 (toString()을 재정의하지 않은 경우) 일반 클래스의 경우 toString() 메서드를 통해 hashCode 메서드가 실행됩니다. 내 대답은 다소 hasCode 메서드에 대해 불분명하다고 생각합니다. – hunter