[英]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.