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

推荐阅读