2

在为其不同方法检测类时,为了使方法在文本文件中执行写入操作。我首先将字符串存储在显式定义的局部变量 3160 中。如何选择这些变量以防止与已经存在的变量发生冲突。

就像在这个片段中的代码每次进入任何方法时都会将类名写入文本文件的工作。为此,必须使用变量 3160 将字符串 s 加载到堆栈上(值保持较大,以便已定义的变量名称与变量 s (3160)不冲突。我的问题是如何在方法中定义局部变量在使用 ASM 库进行检测期间。这个问题对许多人来说似乎还为时过早,但那是因为我是初学者。

    String s= className;
    mv.visitLdcInsn(s);
    mv.visitVarInsn(Opcodes.ASTORE, 3160);
    mv.visitTypeInsn(Opcodes.NEW, "java/lang/StringBuilder");
    mv.visitInsn(Opcodes.DUP);
    mv.visitVarInsn(Opcodes.ALOAD, 3160);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/String", "valueOf", "(Ljava/lang/Object;)Ljava/lang/String;");
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/me/database/dataCollectionFile/Info", "callMeAnyTime", "()Ljava/lang/String;");
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
4

3 回答 3

2

您应该使用LocalVariablesSorter适配器(或者从中扩展您自己的访问者,或者将其添加到 MethodWriter 之前的访问者链中)。然后,当您需要一个新变量时,您可以调用LocalVariablesSorter.newLocal()方法来分配新的变量槽。另请参阅ASM 指南了解更多详细信息。

于 2012-07-26T13:27:16.217 回答
1

我会查看局部变量调试表,我会使用下一个可用的 id,它更有可能是 2 或 10,而不是 3160。

如果没有调试信息,可能需要多次扫码,先看看用了多少个id。

注意:double并且long由于历史原因需要两个 id。

于 2012-07-26T12:57:31.157 回答
1

newLocal(Type.type) 是我发现对我的情况有帮助的,谢谢 Eugene Kuleshov 和

彼得劳里的帮助:)

于 2012-07-26T13:49:20.893 回答