java - 如何使用bytebuddy检测无法访问的代码?

标签 java bytecode byte-buddy

我正在努力使用 ASM 创建一个可以删除无法访问的代码的访问者。目前,代码与ASM 4.0 Guide中提供的代码相同,即:

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 不是代码分析工具,它旨在基于类的 API 生成代码,即它基于字段和方法进行操作。要删除死代码,您应该找到一个静态工具或代码覆盖代理来执行此操作。

关于java - 如何使用bytebuddy检测无法访问的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39660254/

相关文章:

java - j计费 : How to create payment programmatically?

java - 根据对象属性对对象数组列表进行排序

java - 使用专门类型进行 Scala 优化 : sum with longs

java - 如何应用、删除和重新应用 bytebuddy 转换?

java - 具有良好 Java 支持的通用构建工具?

java - J日历 : how to change the foreground color of certain days?

java - Android 上可以使用 ByteBuddy 进行 MethodDelegation 拦截吗?

java - 使用 byte-buddy-agent 修改 java.util 类

python - 为什么这两个功能不同?

java - 字节码生成的访问对象与 GenerationMethodAccessor