如何把Java代码玩出花?JVM Sandbox入门教程与原理浅谈( 五 )

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开发变的异常简单 , 就像作者自己所说“

经验总结扩展阅读