javaAgent本质上是一种动态代理,它是通过字节码注入的方式,形成字节码转换器,在程序运行前,或者在程序运行时,修改代码字节码,然后载入类加载器,做到对代码的修改以及代理。
静态导入在jvm加载原jar前,运行javaagent指定的premain方法,一般会在premain里面操作字节码,在方法前后加入代码,起到监控的作用
通过classPool和loader获取所有类池的类,然后通过类名获取类,然后通过类获取方法,在对其前后添加代码,或者添加属性,注解等。
动态导入项目已经启动了,可以通过使用它的进程id,强行修改它的字节码,agent包需要声明Agent-Class,会调用agentmain方法,这个时候可以重新加载类
javassistJavassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。
可以强行改方法代码。
两者关系一般两者通过结合使用,前者在侵入代码前生成字节码转换器,后者替换字节码,实现对程序无侵入性的监控。
注意:一定要知道代码的内部结构,要不没法改。