java - 如何在使用 asm 库进行检测的方法中查找空的局部变量

标签 java bytecode instrumentation java-bytecode-asm

在检测类的不同方法时,为了使方法在文本文件中执行写入操作。我首先将字符串存储在显式定义的局部变量 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;");

最佳答案

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

关于java - 如何在使用 asm 库进行检测的方法中查找空的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11669461/

相关文章:

java - java编译成class为什么一定要指定classpath?

java - 我可以使用 Instrumentation.getObjectSize 测量内存中列表(包括元素)的大小吗?

java - 检测 Java 类以创建反向 Java 调试器的最佳方法是什么?

java - @Produces 基于条件的注解

java - 是否可以使用字符串作为切换值来用 switch 语句替换 if-else ?

java - 在 Java Lambda 中,为什么在捕获的变量上调用 getClass()

java - 我如何在 [Java/Scala?] 代码中看到 Scala 编译器重写了原始 Scala 代码

android - 在 AndroidTestCase 中访问 AlertDialog

java - 为什么Java有这么大的足迹?

java - @JsonIgnore 和 @JsonBackReference、@JsonManagedReference 之间的区别