簡體   English   中英

使用asm生成字節碼

[英]Generating bytecode using asm

我有這樣的代碼:

tracker.setValue(false);

為此,我需要通過ASM生成字節碼。 因此,使用該工具,我發現上一行的字節碼指令為:

ALOAD 0
GETFIELD example/MethodAdapter.tracker : Lexample/Tracker;
ICONST_0
INVOKEVIRTUAL example/Tracker.setValue (Z)V

因此,當我將其轉換為ASM代碼時,如下所示:

mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "example/MethodAdapter", "tracker", "Lexample/Tracker;");
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKEVIRTUAL, "example/Tracker", "setValue", "(Z)V", false);

(此代碼段已寫入visitMethodInsn ),但是使用-javaagent為測試類運行上述ASM,卻出現異常:

Exception Details:
  Location:
    TestClass.main([Ljava/lang/String;)V @20: getfield
  Reason:
    Type '[Ljava/lang/String;' (current frame, stack[0]) is not assignable to 'example/MethodAdapter'
  Current Frame:
    bci: @20
    flags: { }
    locals: { '[Ljava/lang/String;', 'TestClass' }
    stack: { '[Ljava/lang/String;' }
  Bytecode:
    0000000: b800 02bb 0003 59b7 0004 4c2b b600 052b
    0000010: b600 062a b400 2a03 b600 30b8 0007 b1  

    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
    at java.lang.Class.getMethod0(Class.java:2937)
    at java.lang.Class.getMethod(Class.java:1771)
    at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

我發現此行發生問題:

mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "example/MethodAdapter", "tracker", "Lexample/Tracker;");

看起來ALOAD0不能正確提取this還是我在這里錯過了一些東西?

您正在將代碼插入到main函數中,該函數是靜態的,因此沒有this參數。 第一個參數是字符串數組。

暫無
暫無

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

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