bytebuddy如何检测不可达代码?
How use bytebuddy to detect unreachable code?
我正在努力使用 ASM 创建一个可以删除无法访问的代码的访问者。目前,代码与ASM 4.0指南中提供的相同,即:
public class RemoveDeadCodeAdapter extends MethodVisitor {
String owner;
MethodVisitor next;
public RemoveDeadCodeAdapter(String owner, int access, String name,
String desc, MethodVisitor mv) {
super(Opcodes.ASM4, new MethodNode(access, name, desc, null, null));
this.owner = owner;
next = mv;
}
@Override public void visitEnd() {
MethodNode mn = (MethodNode) mv;
Analyzer<BasicValue> a =
new Analyzer<BasicValue>(new BasicInterpreter());
try {
a.analyze(owner, mn);
Frame<BasicValue>[] frames = a.getFrames();
AbstractInsnNode[] insns = mn.instructions.toArray();
for (int i = 0; i < frames.length; ++i) {
if (frames[i] == null && !(insns[i] instanceof LabelNode)) {
mn.instructions.remove(insns[i]);
}
}
} catch (AnalyzerException ignored) {
}
mn.accept(next);
}
}
所以,问题是:有什么办法可以通过 Bytebuddy 实现这一目标吗?因为 Bytebuddy 看起来还挺容易上手的。如果是,谁能告诉我流程是什么?
Byte Buddy 不是代码分析工具,它用于基于 class 的 API 的代码生成,即它基于字段和方法进行操作。要删除死代码,您应该找到一个静态工具或代码覆盖代理来执行此操作。
我正在努力使用 ASM 创建一个可以删除无法访问的代码的访问者。目前,代码与ASM 4.0指南中提供的相同,即:
public class RemoveDeadCodeAdapter extends MethodVisitor {
String owner;
MethodVisitor next;
public RemoveDeadCodeAdapter(String owner, int access, String name,
String desc, MethodVisitor mv) {
super(Opcodes.ASM4, new MethodNode(access, name, desc, null, null));
this.owner = owner;
next = mv;
}
@Override public void visitEnd() {
MethodNode mn = (MethodNode) mv;
Analyzer<BasicValue> a =
new Analyzer<BasicValue>(new BasicInterpreter());
try {
a.analyze(owner, mn);
Frame<BasicValue>[] frames = a.getFrames();
AbstractInsnNode[] insns = mn.instructions.toArray();
for (int i = 0; i < frames.length; ++i) {
if (frames[i] == null && !(insns[i] instanceof LabelNode)) {
mn.instructions.remove(insns[i]);
}
}
} catch (AnalyzerException ignored) {
}
mn.accept(next);
}
}
所以,问题是:有什么办法可以通过 Bytebuddy 实现这一目标吗?因为 Bytebuddy 看起来还挺容易上手的。如果是,谁能告诉我流程是什么?
Byte Buddy 不是代码分析工具,它用于基于 class 的 API 的代码生成,即它基于字段和方法进行操作。要删除死代码,您应该找到一个静态工具或代码覆盖代理来执行此操作。