首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java:Java代理如何影响你的代码

在构建可扩展的服务器端应用程序时,我们会花费大量时间思考如何在生产中监控、操作和更新代码。一种新的工具已经发展起来,可以帮助Java开发人员做到这一点。它们中的许多都是建立在外部代码可以在运行时与JVM集成的最强大的方式之一Java代理上的。

代理是操作系统本机或Java库(我们将在下面描述它们的区别),JVM为这些库提供了普通应用程序代码无法使用的功能。为了了解这些工具的基础性,让我们看看我们使用的一些依赖它们的工具:

l 探查器使用Java代理修改目标框架的代码,以注入收集性能指标的新代码。这包括独立服务或托管服务,如NewRelic或YourKit。

l JRebel通过构建一种技术将其提升到了一个新的水平,该技术可以在运行时提供平滑的类热交换,而无需重新启动JVM。

l Play框架使用Java代理在运行时实现类的热交换。

l 在Harness,我们利用JVM向本机代理提供的低级功能来显示导致错误的实际源代码和变量值。

Java代理

Java代理是.jar文件,它定义了一个特殊的premain静态函数,JVM将在调用应用程序的主函数之前调用该函数。神奇的部分来自Instrumentation对象,它作为参数由主机JVM传递给这个函数。通过抓住这个对象,代理的代码(在其他方面表现为根类加载器加载的任何Java代码)可以做一些非常强大的事情。

他们做什么

给予代理的最强大的能力是在运行时类中动态重写目标类的方法内容的能力(字段结构是不可变的)。这个过程称为字节码插装,它使代理能够在代码运行时重写方法的内容。

一些例子包括添加对特定方法的调用来分析性能(例如end time–start time)或记录参数值(例如传递给servlet的URL)。另一个例子是在不重启JVM的情况下重新加载一个新版本的类,就像JRebel所做的那样。

这是怎么做到的

对于代理来说,修改代码或加载的类实际上触发了JVM重新加载类的过程,其中类的字节码被替换为新版本。这要求代理能够向JVM提供可验证的新字节码(即符合JVM规范)。不幸的是,在运行时生成正确的字节码并不简单——有很多需求和边缘情况。为此,代理通常使用库来读写字节码。该库使他们能够将现有类的字节码加载到一个类似DOM的结构中,通过添加诸如分析调用之类的东西来修改它,然后将DOM保存回原始字节码。

ASM是一个流行的库,它提供了一个通用的Java字节码操作和分析框架。这是最流行的字节码操作库之一,可以用来修改现有的类或者直接以二进制形式动态生成类。它非常流行,以至于Sun的一些内部代码实际上使用它来解析Java中的字节码。

最后的想法

了解什么是代理以及它们是如何构建的是有好处的,因为即使你最终没有编写一个代理,你今天也可能会依赖其中的一个或多个来驱动你的应用程序。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230328A0776A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券