如何使用 asm 将简单的调用语句添加到类文件中



考虑我有这个Java程序。

public class Main {
public static void main(String []args){
String a = "Dad";      
System.out.println(a);
}

现在我有一个 ASM 代码来遍历方法节点,并且可以访问方法中的指令。假设我添加了调用方法和用于添加简单打印语句的 ldc。 [![在此输入图像描述][1]][1]

for(Object methodNodeObj : classNode.methods) { 
MethodNode methodNode = (MethodNode)methodNodeObj;  
for(AbstractInsnNode abstractInsnNode : methodNode.instructions.toArray()) { 
}
InsnList il = new InsnList();
il.add(new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
il.add(new LdcInsnNode("Works!"));
il.add(new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)V"));
methodNode.instructions.insertBefore(abstractNode, il);

这有助于打印语句... 假设如果我有一个 ALOAD 语句,即有一个变量用法,我想调用编码函数调用,以便在使用过程中对变量进行编码。 所以我的计划是在 ALOAD 语句之后添加编码调用 stmt。 如何实现这一点?

所以你必须用字符串arg调用编码方法.
首先你必须编写方法:public static String encode(String arg) { /* Some code */ }
你可以通过asm调用该方法

il.add(new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
// 1 - first variable in non-static function
// 0 - first variable in static funcnion. Choose wisely.
il.add(new VarInsnNode(Opcodes.ALOAD, 1);
// itf must be true if full.path.to.Class is interface
il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "full/path/to/Class", "encode", "(Ljava/lang/String;)Ljava/lang/String;", false); 
il.add(new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "encode", "(Ljava/lang/String;)V"));
methodNode.instructions.insertBefore(abstractNode, il);

相关内容

  • 没有找到相关文章

最新更新