При отладке следующего кода:
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
Когда отладчик останавливается на строке точки останова, в выводе уже есть две строки, когда я перехожу к методу invoke
, вывод выглядит так, как показано. Как будто отладчик вводит метод invoke
на каждом моем шаге. Потому что, если я не перейду к методу, вывод будет:
BEFORE
AFTER
BEFORE
Hello
AFTER
BEFORE
AFTER
done
BEFORE
AFTER
Если я запускаю код, результат будет таким, как ожидалось.
BEFORE
Hello
AFTER
done
Это ошибка отладчика или я что-то не так делаю?
Оболочка: Windows 64, Intellij IDEA, JDK8