【问题标题】:ASM Bytecode With HttpURLConnection带有 HttpURLConnection 的 ASM 字节码
【发布时间】:2013-02-25 05:32:32
【问题描述】:

使用 ASM ByteCode 库,在创建 HttpUrlConnection ic 时添加请求标头 (UUID) 下面是我的代码 - 也得到了输出 === > 这是 Http CONNECT 方法!。但不知道如何添加标题?

    package com.eg.agent;

    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;

    public class EgHttpMethodVisitorAdapter extends MethodVisitor {

        private String methodName;
        private String className;
        private String description;

        public EgHttpMethodVisitorAdapter(MethodVisitor mv , String  methodName , String description , String className) {
            super(Opcodes.ASM4, mv);
            this.methodName = methodName;
            this.className = className;
            this.description = description;
        }

        public void visitCode() {
            super.visitCode();
            System.out.println("\t [HTTP URL CONNECTION - Method Name]"+methodName +"  Class NAME: "+className  + "  DESC :"+description);
            boolean isConnect =  false;
            if(methodName.equals("connect") && description.equals("()V"))
                isConnect = true;
            if(isConnect) {
                mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
                mv.visitLdcInsn (" ====> This is Http CONNECT Method!");
                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream","println", "(Ljava/lang/String;)V");
            }
        }

        public void visitMaxs(int maxStack, int maxLocals) {
            super.visitMaxs(maxStack + 4, maxLocals);
        }
    }

【问题讨论】:

    标签: java-bytecode-asm bytecode-manipulation


    【解决方案1】:

    我已经解决了。。附上visitCode方法。

        public void visitCode() {
            super.visitCode();
            boolean isConnect =  false;
            if(methodName.equals("connect") && description.equals("()V"))
                isConnect = true;
    
            if(isConnect) {
                // Dynamically add UUID .. 
                mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/UUID", "randomUUID", "()Ljava/util/UUID;");
                mv.visitVarInsn(Opcodes.ASTORE, 3); 
                mv.visitVarInsn(Opcodes.ALOAD, 0);  
                mv.visitLdcInsn("GUID");
                mv.visitVarInsn(Opcodes.ALOAD, 3); 
                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/UUID", "toString", "()Ljava/lang/String;");
                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/net/HttpURLConnection", "addRequestProperty", "(Ljava/lang/String;Ljava/lang/String;)V");
                mv.visitCode();
            }
        }
    

    【讨论】:

      【解决方案2】:

      您可能会发现ASM FAQ Question 11 很有帮助。

      【讨论】:

      • 您好 Eugene Kuleshov,非常感谢您的帮助... :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多