2016-09-23 16 views
1

我在這裏用ASM掙扎着創建一個可以刪除無法訪問的代碼的訪問者。現在,該代碼是一樣的ASM 4.0指南中提供的,那就是:如何使用bytebuddy來檢測不可達代碼?

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似乎很容易工作。如果是的話,有人可以告訴我該過程是什麼?

回答

1

字節Buddy是沒有代碼分析工具,它是用於基於一類的API代碼生成的,即,其運行基於字段和方法。要刪除死代碼,您應該找到一個靜態工具或代碼覆蓋代理。