Jar 文件作为 java 中的代理

Jar file as agent in java

何时将 jar 文件作为 agent 添加到 java 中以及何时应将其添加到 bootclasspath 中?

示例: 为什么我们在 eclipse 启动时将 lombok.jar 添加为 agent,为什么还要添加 bootclasspath

 -javaagent:/home/$USER/eclipse/4.4-luna-SR2/lombok.jar
 -Xbootclasspath/a:/home/$USER/eclipse/4.4-luna-SR2/lombok.jar

首先,在lombok 1.16.x中不再需要添加lombok.jar到bootclasspath。

代理位于自己的类路径中,但与常规程序共享引导类路径。

代理通常使用检测来修改程序中 类 的字节码。如果这些修改从您的程序中添加了对仅在代理 jar 中可用的代码的调用,则应用程序类加载器和验证器将根据程序的类路径解析这些调用,使用应用程序类加载器,而应用程序类加载器又使用父类加载器,一直向上到引导类加载器。有关详细信息,请参阅 Oracle documentation

由于代理类加载器不在父类加载器结构中,您无法调用仅在代理的 jar 文件中可用的代码。

最简单的解决方案是将代理的 jar 添加到引导类路径,使代理和程序都可以使用代理的 jar 中的代码。

在 lombok 1.16.x 中,使用了不同的方法。代理修改 Eclipse 类加载器以在解析 类.

时也查看 lombok.jar

披露:我是 lombok 开发人员。