<small id='ub9So'></small> <noframes id='cyasU84lbQ'>

  • <tfoot id='cqya2SOX'></tfoot>

      <legend id='ceHWTV0So'><style id='3rTOCsG'><dir id='SrfM7ap'><q id='Ock6n'></q></dir></style></legend>
      <i id='ep8m'><tr id='7XnuazKTS'><dt id='XnJFAirc'><q id='TYbW'><span id='xdFGA'><b id='JRz7kUV'><form id='c8ixW26U'><ins id='xlSqL6i'></ins><ul id='Oc3d'></ul><sub id='SsYCcK'></sub></form><legend id='EsHl4C1Op'></legend><bdo id='ZkHJ3mSlc'><pre id='pSug2NxO'><center id='tShZ3'></center></pre></bdo></b><th id='DBGokyAsur'></th></span></q></dt></tr></i><div id='EdQAr'><tfoot id='EYxrFe'></tfoot><dl id='dEeVGl2'><fieldset id='iJByrLZz'></fieldset></dl></div>

          <bdo id='VR0E'></bdo><ul id='wrz1t9D7j'></ul>

          1. <li id='6GQoq'></li>
            登陆

            章鱼彩票提现-java经过插桩的概念来完结监控体系的规划

            admin 2020-02-14 166人围观 ,发现0个评论

            上节说了javaagent和javassist,其实javassist也是根据ASM完成的。一般人不懂得JVM指令的话,底子ASM搞不起来,也用到了访问者的规划方式,看起来跟我们写代码不是一个套路,学习本钱比较高,所以有了javassist。章鱼彩票提现-java经过插桩的概念来完结监控体系的规划

            源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』插桩处理埋点(113)/



            (一)插桩

            • 修正上节源码,进行插桩

            IdigAgentTest

            package com.idig8;
            import com.idig8.agent.test.UserServiceImpl;
            import java.lang.instrument.Instrumentation;
            public class IdigAgentTest {
            public static void main(String[] args) {
            System.out.println("hello world idig8!");
            UserServiceImpl userService = new UserServiceImpl();
            userService.hello();
            }
            }



            UserServiceImpl 增加hello办法,打印办法里边的内容

            package com.idig8.agent.test;
            public class UserServiceImpl {
            public UserServiceImpl(){
            System.out.println("hello world!");
            }
            public void hello(){
            String p1 ="100";
            System.out.print("p1 = "+p1);
            }
            }



            IdigAgent 增加插桩的办法

            package com.idig8.agent.test;
            import javassist.*;
            import java.io.IOException;
            import java.lang.instrument.ClassFileTransformer;
            import java.lang.instrument.IllegalClassFormatException;
            import java.lang.instrument.Instrumentation;
            imp章鱼彩票提现-java经过插桩的概念来完结监控体系的规划ort java.security.ProtectionDomain;
            public class IdigAgent {
            public static void premain(String args, Instrumentation instrumentation) {
            System.out.println("premain:" + args);
            instrumentation.addTransformer(new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoa章鱼彩票提现-java经过插桩的概念来完结监控体系的规划der loader, String className, Class
            ProtectionDomain protectionDomain,
            byte[] classfileBuffer) throws IllegalClassFormatException {
            if (!"com/idig8/agent/test/UserServiceImpl".equals(className)) {
            return null;
            }
            // javassist 东西 改造
            try {
            ClassPool pool = new ClassPool();
            pool.insertClassPath(new LoaderClassPath(loader));
            CtClass ctclass = pool.get("com.idig8.agent.test.U朴宗哲serServiceImpl");
            CtMethod method = ctclass.getDeclaredMethod("hello");
            method.insertBefore(" Syst章鱼彩票提现-java经过插桩的概念来完结监控体系的规划em.out.println(System.currentTimeMillis());");
            // method.insertBefore("long begin = System.currentTimeMillis();"
            // +" System.out.println(begin);");
            //
            // method.insertAfter(" long end = System.currentTimeMillis();\n" +
            // " System.out.println(end - begin);");
            return ctclass.toBytecode();
            } catch (NotFoundException e) {
            e.printStackTrace();
            } catch (CannotCompileException e) {
            e.printStackTrace();
            } catch (IOException e) {
            e.printStackTrace();
            }
            return null;
            }
            });
            }
            }



            pom中增加javassist的jar包

             
            org.javassist
            javassist
            3.18.1-GA



            • 代码的履行流程

            Idig章鱼彩票提现-java经过插桩的概念来完结监控体系的规划AgentTest履行这个办法

            IdigAgent ->IdigAgentTest->UserServiceImpl的类->UserServiceImpl被插桩发动开端的hello-> 打印hello办法体

            premain:abc //IdigAgent 
            hello world idig8! //IdigAgentTest
            hello world! //UserServiceImpl的类
            1562479947074 //UserServiceImpl被插桩发动开端的hello
            p1 = 100 //打印hello办法体



            • 留意代码

            参加insertBefore中的bgin 和 insertAfter 的 end 经过end-begin 可是后台报错了



            javassist.CannotCompileException: [source error] no such field: begin

            为什么呢,由于插桩的时分都是以代码快的方式,局部变量。



            在实践开发中不必修正原有的办法,而是会新写一个办法,在新办法进行出来,调用要插桩的办法。新办法的参数和要插桩的保持一致,包含注解,参数。其实有点相似动态署理。

             public void hello$agent()
            {
            {
            long begin = System.currentTimeMillis();
            try{
            hello();
            }finally {
            long end = System.currentTimeMillis();
            System.out.println(end - begin);
            }
            }
            }



            看到这儿,点了重视吧!

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP