java - 使用ASM注入(inject)字节码时出现StringIndexOutOfBoundsException错误

标签 java bytecode

早上好,
我正在尝试注入(inject)此代码:

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>"

关于java - 使用ASM注入(inject)字节码时出现StringIndexOutOfBoundsException错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423699/

相关文章:

lambda - Kotlin 为 lambda 生成内部类

java - NSIS Eclipse 插件无法在 Helios 和 Linux 平台上工作

java - Rectangle.getX() 返回上角还是中心?

java - 在另一个 Activity 中打开抽屉导航菜单

java - 没有任何构造函数的 JVM 字节码类是否有效?

c++ - 将 luac 字节码嵌入到 C/C++ 源文件中

java - 具有泛型集合的 For 循环无法在 Java 7 中编译

java - 在一个 for 循环中计算整数数组的标准差,而无需提前知道平均值

java - 方法标记为抽象但未由 javap 显示

java - 在 ByteBuddy rebase 期间拦截构造函数