自动化回归测试平台 AREX Agent 源码再阅读

AREX 启动过程

通用 Java Agent 的启动过程

Java Agent 是一种 Java 应用程序,它可以在 Java 应用程序启动时动态地注入到 JVM 中,并在应用程序运行时监视和修改应用程序的行为。Java Agent 通常用于性能分析、代码覆盖率、安全检查等方面。

以下是 Java Agent 的启动过程:

  1. 编写 Java Agent 程序,实现 premain 方法。premain 方法是 Java Agent 的入口方法,它会在 Java 应用程序启动时被调用。在 premain 方法中,可以进行一些初始化操作,如设置代理、加载配置文件等。

  2. 将 Java Agent 打包成 jar 文件,并在 MANIFEST.MF 文件中指定 Premain-Class 属性,该属性指定了 Java Agent 的入口类。

  3. 在启动Java应用程序时,通过 -javaagent 参数指定 Java Agent 的 jar 文件路径。例如:

    java -javaagent:/path/to/agent.jar -jar myapp.jar

    在上面的命令中,/path/to/agent.jar 是 Java Agent 的 jar 文件路径,myapp.jar 是 Java 应用程序的 jar 文件路径。

  4. 当 Java 应用程序启动时,JVM 会加载 Java Agent 的 jar 文件,并调用 premain 方法。在 premain 方法中,Java Agent 可以使用 Java Instrumentation API 来修改 Java 应用程序的字节码,实现对应用程序的监视和修改。

AREX 源码视角的启动过程

步骤一

arex-agent module pom.xml文件中,通过配置manifestEntries,将Premain-Class属性设置为io.arex.agent.ArexJavaAgent。这意味着在构建arex-agent.jar时,将在manifest文件中指定ArexJavaAgent类作为 Agent 的入口点。

步骤二

ArexJavaAgent类中,实现了premain方法作为Agent的入口方法。在premain方法中,它调用了agentmain方法。在agentmain方法中,进一步调用了init(Instrumentation inst, String agentArgs)函数。这个函数接受一个Instrumentation对象和一个字符串参数agentArgs

步骤三

init函数中,有两个重要的操作:installBootstrapJar()AgentInitializer.initialize()

installBootstrapJar()

installBootstrapJar()函数根据AgentInitializer.class找到其所在的 jar 包,并通过调用inst.appendToBootstrapClassLoaderSearch(jar)将其添加到Bootstrap ClassLoader的搜索路径中。Bootstrap ClassLoader是Java虚拟机中负责加载核心类库(如java.langjava.util等)的特殊类加载器。通过调用appendToBootstrapClassLoaderSearch方法,可以将自定义的类库添加到Bootstrap ClassLoader的搜索路径中,从而使得Java应用程序能够使用这些自定义的类库。

如要根据 class 对象或者 jar 包的实现,获取一个类所在的 jar 包,可以按照以下步骤进行:

  1. 获取该类的Class对象。
  2. 调用Class对象的getProtectionDomain()方法获取该类的ProtectionDomain对象。
  3. 调用ProtectionDomain对象的getCodeSource()方法获取该类的CodeSource对象。
  4. 调用CodeSource对象的getLocation()方法获取该类所在的jar包的URL。
  5. 通过URL对象的getFile()方法获取该jar包的路径。

AgentInitializer.initialize()

AgentInitializer.initialize()函数是根据ArexJavaAgent.class找到其所在的jar包(AgentInitializer.java文件),然后设置arex.agent.jar.file.path变量,即代理jar包所在的目录。

接下来,它会在该目录下查找/extensions/子目录,并读取该目录下的所有jar包文件,这些文件是扩展包所在的位置。

然后,调用createAgentClassLoader(agent jar, 扩展包.jar)函数,创建一个AgentClassLoader对象,它是AREX自定义的类加载器。使用自定义的类加载器是为了隔离,防止应用程序能够访问AREX Agent的代码。

接着,调用createAgentInstaller()函数,该函数使用前面生成的Ag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值