Instrumentation的局限性:
- 不能通过字节码文件和自定义的类名重新定义一个本来不存在的类
- 增强类和老类必须遵循很多限制:比如新类和老类的父类必须相同;新类和老类实现的接口数也要相同 , 并且是相同的接口;新类和老类访问符必须一致 。新类和老类字段数和字段名要一致;新类和老类新增或删除的方法必须是private static/final修饰的;
https://www.cnblogs.com/rickiyang/p/11368932.html
再谈Attach和Agent上面的实战章节中已经提到了attach和agent两者的区别 , 这里再展开聊聊 。
在Instrumentation中 , Agent模式是通过
-javaagent:<jarpath>[=<选项>]
从应用启动时候就插桩 , 随着应用一起启动 。它要求指定的类中必须要有premain()方法 , 并且对premain方法的签名也有要求 , 签名必须满足以下两种格式:public static void premain(String agentArgs, Instrumentation inst)public static void premain(String agentArgs)
一个java程序中-javaagent
参数的个数是没有限制的 , 所以可以添加任意多个javaagent 。所有的java agent会按照你定义的顺序执行 , 例如:java -javaagent:agent1.jar -javaagent:agent2.jar -jar MyProgram.jar
上面介绍Agent模式的Instrumentation是在 JDK 1.5中提供的 , 在1.6中 , 提供了attach方式的Instrumentation , 你需要的是agentmain方法 , 并且签名如下:public static void agentmain (String agentArgs, Instrumentation inst)public static void agentmain (String agentArgs)
这两种方式各有不同用途 , 一般来说 , Attach方式适合于动态的对代码进行功能修改 , 在排查问题的时候用的比较多 。而Agent模式随着应用启动 , 所以经常用于提前实现一些增强功能 , 比如我上面实战中的启动观测 , 应用防火墙 , 限流策略等等 。总结本文花了较短的篇幅重点介绍了JVM Sandbox的功能 , 实际用法 , 以及基础原理 。它通过封装一些底层JVM控制的框架 , 使得对JVM层面的AOP开发变的异常简单 , 就像作者自己所说“
经验总结扩展阅读
- 如何理解Java中眼花缭乱的各种并发锁?
- 鳝鱼怎么杀和洗
- 紫河车粉的最佳吃法
- 2023年属龙人农历十月婚嫁如何 哪天结婚吉祥
- 新qq如何快速升级qq怎么快速升级(在qq怎么快速升级等级)
- 英雄联盟怎么玩好(新人如何玩好英雄联盟)
- 如何才能玩好英雄联盟(怎么样才能玩英雄联盟最好)
- 手把手教你使用netty搭建一个DNS tcp服务器
- 2023测绘类专业包括哪些 就业前景如何
- 什么是 X.509 证书以及它是如何工作的?