簡體   English   中英

使用ASM注入字節碼時出現StringIndexOutOfBoundsException錯誤

[英]StringIndexOutOfBoundsException error when injecting bytecode using ASM

早上好,
我正在嘗試注入以下代碼:

int i = getKey();
String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
System.out.println(timeStamp + " " + i);

在使用ASM庫的現有方法中。

因此,我嘗試在工具ASMifier的一個非常基本的類中運行此代碼。 之后,我復制了我感興趣的輸出部分。

mv.visitTypeInsn(NEW, "java/text/SimpleDateFormat");
mv.visitInsn(DUP);
mv.visitLdcInsn("yyyy.MM.dd.HH.mm.ss");
mv.visitMethodInsn(INVOKESPECIAL, "java/text/SimpleDateFormat", "", "(Ljava/lang/String;)V", false);
mv.visitTypeInsn(NEW, "java/util/Date");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/util/Date", "", "()V", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/text/SimpleDateFormat", "format", "(Ljava/util/Date;)Ljava/lang/String;", false);
mv.visitVarInsn(ASTORE, 3);
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "", "()V", false);
mv.visitVarInsn(ALOAD, 3);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitLdcInsn(" ");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitVarInsn(ILOAD, 2);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);

但是后來我得到一個錯誤

*Exception in thread "main" 
java.lang.StringIndexOutOfBoundsException: String index out of range: 0

在編譯時就行了:

mv.visitMethodInsn(INVOKESPECIAL, "java/text/SimpleDateFormat", "", "(Ljava/lang/String;)V", false);

為什么會出現此錯誤?

堆棧跟蹤:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(String.java:658)
    at org.objectweb.asm.Frame.a(Unknown Source)
    at org.objectweb.asm.MethodWriter.visitMethodInsn(Unknown Source)
    at MethodAdapter.visitMethodInsn(MethodAdapter.java:33)
    at org.objectweb.asm.ClassReader.a(Unknown Source)
    at org.objectweb.asm.ClassReader.b(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at Main.main(Main.java:20)

看起來方法的名稱為空。

如果嘗試調用構造函數,則將方法名稱設置為"<init>"

暫無
暫無

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

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