【发布时间】:2015-01-08 20:52:43
【问题描述】:
在 ASM 中,我试图确定 try-catch 块的标签。
目前我有:
public void printTryCatchLabels(MethodNode method) {
if (method.tryCatchBlocks != null) {
for (int i = 0; i < method.tryCatchBlocks.size(); ++i) {
Label start = method.tryCatchBlocks.get(i).start.getLabel();
Label end = method.tryCatchBlocks.get(i).end.getLabel();
Label catch_start = method.tryCatchBlocks.get(i).handler.getLabel();
System.out.println("try{ " + start.toString());
System.out.println("} " + end.toString());
System.out.println("catch { " + catch_start.toString());
System.out.println("} " /*where does the catch block end?*/);
}
}
}
我正在尝试确定标签在 catch 块末尾的位置,但我不知道如何。为什么我需要它?因为我想从字节码中“删除”try-catch 块。
例如,我正在尝试改变:
public void test() {
try {
System.out.println("1");
} catch(Exception e) {
//optionally rethrow e.
}
System.out.println("2");
}
到:
public void test() {
System.out.println("1");
System.out.println("2");
}
所以要删除它,我认为我可以获取标签并删除catch-start和catch-end之间的所有指令,然后删除所有标签。
有什么想法吗?
【问题讨论】:
标签: java bytecode java-bytecode-asm bytecode-manipulation