当前位置: 首页 > 网络应用技术

Arthas原理Bytecode增强技术

时间:2023-03-06 20:52:52 网络应用技术

  AOP的核心概念(面向方面的编程)是基于不更改源代码的前提,该方法是通过图中所示的“水平切割”方法的“水平切割”方法。

  一般而言,成熟的系统通常包含,但不限于以下6点的一般逻辑:

  用AOP术语,我们将这些通用逻辑称为一个方面。想象一下,如果包含上述业务模块的共享代码充满了上述业务模块?显然,当依赖方更改时,它就无法有助于要维护程序中依赖关系的所有逻辑代码,这不利于维护。如果要解决此疼痛点,则必须从逻辑代码中剥离这些共享代码,以使其形成独立的模块,并应用它要在语句中进行特定的逻辑代码。为了消除程序中不必要的依赖性,请提高开发效率和重新组装代码。这是我们使用AOP的最初意图。

  AOP与特定的实施技术无关。只要它与AOP一致,我们都可以称其为AOP.在目前,市场上AOP框架的实施方案通常基于以下两种形式:

  在编译期间,静态的编织选择以将AOP插入目标类中的AOP增强逻辑。在运行期间以动态代理形式增强目标类的动态编织选择,例如CGLIB,Javassist,ASM和ASM和其他Bytecode Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Generating Ode工具可用于支持该解决方案的实现。

  动态编织技术首先,我们可以尝试在运行时是否动态更改类。

  上面的代码我们删除基本base = new base();该行可以正常执行,但是在此行我们会看到以下错误。它表明不允许JVM在运行时动态加载类,也就是说,热量替换了类。

  既然这条路不可用,还有其他方法吗?

  幸运的是,从JDK1.5开始,Java的设计师提供了基于Java.lang.instrumen软件包的开发人员,根据仪器API为开发人员提供了基于Instrument-API的开发人员,该仪器API基于JVMTI(JAVA Virtual Machinial Alokal Interal Funterface,Machine Alokal Interface,Machine interface,forness-api)。Java虚拟机床界面)规范。它使其能够使用仪器来构建独立于应用程序的代理程序,以监视和协助在JVM上运行的程序,最重要的是,使用仪器可以修改并替换运行时的类定义。换句话说,这等同于我们可以动态增强目标类方法。

  例如,ASM更加复杂,需要理解。Javassist的实现相对简单。

  代理模块

  POM文件

  AgentMain Class.AgentMain是代理过程的输入方法。

  增强的代理类别主要达到了一段时间。

  该代理是由MVN ISNTALL命令由本地JAR软件包制成的。

  字节码插入桩的目标类别和方法

  MIAN运行底板的方法,您将看到一两秒钟的印刷运行一次。

  代理附加代码,该代码的作用是在运行目标JVM进程的目标JVM过程中增强字节代码。

  原始:https://juejin.cn/post/7099763315710099469