簡體   English   中英

使用asm進行字節碼檢查的代碼示例

[英]code example for bytecode inspection using asm

假設沒有可用的源代碼的Java類,我們只有.class文件。 該類實現JDK的Comparable接口。 我想以編程方式知道compareTo方法訪問哪些字段/獲取方法。

使用asm字節碼庫,我想獲取在特定方法內調用的所有getter或字段訪問的列表。 有沒有可用的代碼示例?

使用ASM,您將必須使用自定義MethodVisior ,對於方法的字節碼中的每個方法調用,都會調用該方法。 您將必須從自定義ClassVisitor創建此訪問者, ClassVisitor僅返回compareTo方法的該方法訪問者。

new ClassReader(Foo.class.getName()).accept(new ClassVisitor() {
  @Override
  public MethodVisitor visitMethod(int access, String name, String desc, 
      String signature, String[] exceptions) {
    if(name.equals("compareTo") { // We found a method named 'compareTo'
      return new MethodVisitor() {
        @Override // Callback for byte code method instructions
        public void visitMethodInsn(int opcode, String owner, 
            String name, String desc) {
          System.out.println("Method " + name + " was called on " + owner);
        }
        @Override // Callback for byte code field instructions
        public void visitFieldInsn(int opcode, String owner, 
            String name, String desc) {
          System.out.println("Field " + name + " was accessed on " + owner);
        }
      }
    }
    return null;
  }
}

我沒有在代碼片段中包含構造函數參數。 如果compareTo方法可能已重載,則您將必須進一步檢查調用了哪些方法。 另外,您可能需要進一步檢查方法指令的描述符和所有者,這兩個概念在ASM手冊中進行了詳細討論。 您可以使用Type類來簡化您的任務。

根據您對compareTo方法的了解,邏輯將變得更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM