Вы можете обработать свои двоичные классы, ищущие fdiv операции, вставив чек для деления на ноль.
Java:
return x.getFloat()/f2;
javap выход:
0: aload_0
1: invokevirtual #22; //Method DivByZero$X.getFloat:()F
4: fload_1
5: fdiv
6: freturn
код замены, который бросает ArithemticException для деления на ноль:
0: aload_1
1: invokevirtual #22; //Method DivByZero$X.getFloat:()F
4: fstore_2
5: fload_0
6: fconst_0
7: fcmpl
8: ifne 21
11: new #32; //class java/lang/ArithmeticException
14: dup
15: ldc #34; //String/by zero
17: invokespecial #36; //Method java/lang/ArithmeticException."<init>":(Ljava/lang/String;)V
20: athrow
21: fload_2
22: fload_0
23: fdiv
24: freturn
Эта обработка может быть сделано использование байт-кода API, такие как ASM. Это не совсем тривиально, но это не ракетостроение.
Если все, что вы хотите, контроль (а не менять работу кода), то лучше подход может использовать отладчик. Я не уверен, какие отладчики позволят вам написать выражение, чтобы поймать то, что вы ищете, но нетрудно написать собственный отладчик. Sun JDK предоставляет код JPDA и пример кода, показывающий, как его использовать (unzip jdk/demo/jpda/examples.jar).
Пример кода, который подключается к разъему на локальном хосте:
public class CustomDebugger {
public static void main(String[] args) throws Exception {
String port = args[0];
CustomDebugger debugger = new CustomDebugger();
AttachingConnector connector = debugger.getConnector();
VirtualMachine vm = debugger.connect(connector, port);
try {
// TODO: get & use EventRequestManager
vm.resume();
} finally {
vm.dispose();
}
}
private AttachingConnector getConnector() {
VirtualMachineManager vmManager = Bootstrap.virtualMachineManager();
for (Connector connector : vmManager.attachingConnectors()) {
System.out.println(connector.name());
if ("com.sun.jdi.SocketAttach".equals(connector.name())) {
return (AttachingConnector) connector;
}
}
throw new IllegalStateException();
}
private VirtualMachine connect(AttachingConnector connector, String port)
throws IllegalConnectorArgumentsException, IOException {
Map<String, Connector.Argument> args = connector.defaultArguments();
Connector.Argument pidArgument = args.get("port");
if (pidArgument == null) {
throw new IllegalStateException();
}
pidArgument.setValue(port);
return connector.attach(args);
}
}