iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >不用Jar包的Agent的优点有哪些
  • 113
分享到

不用Jar包的Agent的优点有哪些

2023-06-16 00:06:45 113人浏览 薄情痞子
摘要

本篇内容介绍了“不用jar包的Agent的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提起 JavaAgent,很多人都说几句,

本篇内容介绍了“不用jar包的Agent的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

提起 JavaAgent,很多人都说几句,就像古龙武侠小说里的「孔雀翎」,威力很大,江湖上都是它的传说。但真的见识过的人并没几个。

JavaAgent 虽说没这么神秘,但也一直给人曲高和寡的感觉,除了一些中间件产品、大型的框架中使用外,在业务中一直很少出现。

原因可能有很多,一来是可能确实不需要,再者需要开发独立的 Agent Jar 文件,在 Jar 内对类的 transfORM 开发也并不容易。

我们知道,无论是启动时的 Java Agent,还是运行时的动态 attach 到远程JVM, 都是为了拿到 Instrument,对 class  的字节码进行修改。这么底层的东西,当然使用起来让人不太容易下手。

不过就像机器语言不方便,人们发明了汇编语言,又发现了高级语言。对于字节码的操作也类似,人们觉得直接操作字节码有难度,而且需要深入理解 JVM  规范,具体什么位置多少字节代表啥,这不是一般人喜欢的,于是 ASM 框架出现了;但还是有规范的影子,不太「高级」,于是又出现了Javassist  这一类的「高级」工具

我们今天要说的这个工具,和 Javassist 类似,都提供了更高层的api,来操作class,对普通程序员更友好,除此之外呢?

就像今天人们购物、读书等,都更相信专业的平台、或者专家的推荐,像XX严选,XX读书会推荐。今天说的这个工具是Duke 的推荐,对,就是它, Java  的吉祥物,这个小胖子。今天的这个工具在 2015年被 oracle 评选为「Duke's Choice award」。

除了Duke,框架也得到了众多开发者的认可,每年有七千多万次的下载。

这个工具是:Bytebuddy。

从名字你就看的出来,它立志要做字节码的好伙伴。所以在很多开源框架里也能看到它的身影。

不用Jar包的Agent的优点有哪些

既然已经有了不少的工具, byteBuddy能带来什么不一样呢?

除了API 上的简洁易操作,官方自己也大字强调了运行时动态的「代码生成和字节码操作」,不需要再借助 Java 编译器。

来看看官网是怎么自我介绍的,后面再附上几个代码片段,就能很快 Get 到了。

官网:https://bytebuddy.net/

Byte Buddy is a code generation and manipulation library for creating and  modifying Java classes during the runtime of a Java application and without the  help of a compiler. Other than the code generation utilities that ship with the  Java Class Library, Byte Buddy allows the creation of arbitrary classes and is  not limited to implementing interfaces for the creation of runtime proxies.  Furthermore, Byte Buddy offers a convenient API for changing classes either  manually, using a Java agent or during a build.

阅读理解开始。重点你一定会看到了:

  • 「code generation」

  • 「creating and modifying Java classes」

作者贴心的加了一段小字来描述框架的优势。选重点的说就是:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 不需要理解字节码,也不需要理解class 文件格式

  3. API 非侵入,设计简洁易懂

  4. 高度可定制,可以任意自定义

我自己认为该把这点也加上,不写 Java Agent 也可以 Attach 到 JVM 上,把 ByteBuddy  自己当成一个Agent,运行时直接install。Cool。

不写JVM Agent 也能对类拦截和修改,我们来认识下揭开字节码修改黑魔法的家伙。

为了对 Class 进行一些操作,我们一般都离不了 JVM Agent。不管是启动时直接连接,还是运行时动态的 Attach到对应的JVM 上,都需要  Agent。也就是我们熟悉的premain 和 agentmain 的触发入口,通过它们,我们才能拿到 Instrumentation,从而进行  transform和 redeine。

但这个东西的使用,给人总是「阳春白雪」的感觉,让人觉得是黑魔法一样,一般不会轻易尝试使用。

有了ByteBuddy,就不用再羡慕一些框架的「运行时增强」,「动态织入」等等,都可以实现。

如何上手呢?

只需要下载 Jar 文件或者 Maven 添加依赖之后就能狂奔了。

比如官方的这个 HelloWorld

Class<?> dynamicType = new ByteBuddy()   .subclass(Object.class)   .method(ElementMatchers.named("toString"))   .intercept(FixedValue.value("Hello World!"))   .make()   .load(getClass().getClassLoader())   .getLoaded();   assertThat(dynamicType.newInstance().toString(), is("Hello World!"));

直接把 Object 的 toString 方法改写了。

再比如我们可以在开发 Java Agent的时候使用这个伙计

public static void premain(String args, Instrumentation inst) {         AgentBuilder agentBuilder = new AgentBuilder.Default();         AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {             public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder,                                                     TypeDescription typeDescription,                                                     ClassLoader classLoader, JavaModule javaModule) {                 String className = typeDescription.getCanonicalName();                 builder = builder.method(ElementMatchers.any())//匹配任意方法                             .intercept(MethodDelegation.to(new SimplePackageInstanceMethodInterceptor()));                 return builder;             }         };           agentBuilder = agentBuilder.type(ElementMatchers.nameStartsWith("com.example.hello.sample")).transform(transformer);         agentBuilder.installOn(inst);     }

在类里进行拦截匹配的时候,可以通过类名来限定,同时以不同的模式去匹配方法名等,这里的ElementMatchers可以用在类名与方法名等匹配场景中

//ElementMatchers.named("abc") // 特定名称的方法 //ElementMatchers.nameStartsWith("hello")  // 以什么开头的 //ElementMatchers.nameEndsWith("test")   // 以什么结尾的

我们看到前面的代码中 agentBuilder.installOn(inst);

通过 JavaAgent的Instrument 进行类修改。

AgentBuilder 还提供了一个神奇的方法:

agentBuilder.installOnByteBuddyAgent();

这样无须提供 Jar 文件也一样能实现运行时增强。不过需要注意,这样使用时,一定要先执行这行代码,这也是其实现的秘密:

ByteBuddyAgent.install();

因为 ByteBuddy 自己做为一个 Jar 也 Attach ,然后再将其它后续的增强代码加入,像不像「特洛伊木马」 :)

另外, ByteBuddy 还支持类似于 aop 的 Advice实现,在拦截指定方法后可以实现OnMethodEnter 和 OnMethodExit  的控制,在这其中,可以完成绕过用户代码,执行自定义内容的逻辑。

咱们在开始的时候,还提到了代码的生成。这在 ByteBuddy 看来也是易如反掌。

和上面的代码一样,先要拿到 AgentBuilder,之后在执行 tranform的时候,直接指定方法名,以及对应的参数,访问控制符等。

DynamicType.Builder.MethodDefinition.ExceptionDefinition<?> hello =                                 builder.defineMethod(methodName, types, Visibility.PUBLIC)                                         .withParameters(m.getParameters().asTypeList());

再比如在运行时给一个方法增加注解,

builder.method(ElementMatchers.named("methodName")).intercept(SuperMethodCall.INSTANCE)                            .annotateMethod(AnnotationDescription.Builder.ofType(TestAnnotation.class)                                    .define("testValue", 123).build());

是不是功能很强大?

“不用Jar包的Agent的优点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 不用Jar包的Agent的优点有哪些

本文链接: https://www.lsjlt.com/news/281905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 不用Jar包的Agent的优点有哪些
    本篇内容介绍了“不用Jar包的Agent的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!提起 JavaAgent,很多人都说几句,...
    99+
    2023-06-16
  • java中常用jar包有哪些
    本篇内容主要讲解“java中常用jar包有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中常用jar包有哪些”吧!commons-io.jar:可以...
    99+
    2024-04-02
  • jar包的启动方式有哪些
    本文小编为大家详细介绍“jar包的启动方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“jar包的启动方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、各种启动方式1.java -jar#&nb...
    99+
    2023-07-05
  • java执行jar包的方法有哪些
    Java执行JAR包的方法有以下几种:1. 命令行方式:打开命令行窗口,使用java命令执行JAR包。例如:java -jar yo...
    99+
    2023-08-08
    java jar
  • MySQL的Jar包有哪些重要功能?
    标题:MySQL的Jar包有哪些重要功能? MySQL是一种流行的关系型数据库管理系统,许多Java开发人员在开发应用程序时都会使用MySQL数据库。为了在Java项目中与MySQL数...
    99+
    2024-03-01
    数据库管理 连接数据库 执行sql语句
  • 使用Vue.js的优点有哪些
    本篇内容主要讲解“使用Vue.js的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用Vue.js的优点有哪些”吧!1. 使用Vue插槽使你的代码易于...
    99+
    2024-04-02
  • 使用hbase的优点有哪些
    这篇文章给大家介绍使用hbase的优点有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分...
    99+
    2023-05-31
    hbase
  • Python的优点有哪些
    这篇文章主要讲解了“Python的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的优点有哪些”吧!  基于Python本身的优点:简单,易学,速度快,免费、开源,高层语...
    99+
    2023-06-02
  • vscode的优点有哪些
    vscode的优点有以下几点:轻量级vscode是一款轻量级的编辑器,安装包小,且启动速度快,可以提高用户体验。插件丰富vscode拥有丰富的插件系统,可以编辑HTML、CSS、JS、TS、Vue、React等前端代码和JAVA、Pytho...
    99+
    2024-04-02
  • ChatGPT的优点有哪些
    这篇“ChatGPT的优点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ChatGP...
    99+
    2023-02-20
    chatgpt
  • DevOps的优点有哪些
    这篇文章主要讲解了“DevOps的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DevOps的优点有哪些”吧!DevOps(Development和Operations的组合词)是...
    99+
    2023-06-27
  • 使用JNDI的优点有哪些
    使用JNDI的优点有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、JNDI是什么?JNDI--Java 命名和目录接口(Java Naming and Director...
    99+
    2023-05-31
    jndi
  • UGUI的优点有哪些
    这篇文章主要为大家展示了“UGUI的优点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“UGUI的优点有哪些”这篇文章吧。UGUI的优点新UI系统二 直观、易于使用对于UI控件,开发者可以直...
    99+
    2023-06-04
  • HTAP的优点有哪些
    这篇文章主要讲解了“HTAP的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTAP的优点有哪些”吧!4 月 25 日,领先的企业级开源分布式数据...
    99+
    2024-04-02
  • Swagger3的优点有哪些
    这篇文章主要介绍“Swagger3的优点有哪些”,在日常操作中,相信很多人在Swagger3的优点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Swagger3的优点有...
    99+
    2024-04-02
  • Log4j2的优点有哪些
    这篇文章主要讲解了“Log4j2的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Log4j2的优点有哪些”吧!Log4j2简介Apache Log4j 2是 Log4j(1) 的升...
    99+
    2023-06-15
  • pandas的优点有哪些
    本篇内容主要讲解“pandas的优点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pandas的优点有哪些”吧!下面是一个例子,数据获取方式见文末。>>> im...
    99+
    2023-06-15
  • VPS的优点有哪些
    VPS的优点有:1、VPS的扩展性强,能够无限创建网站子目录以及升级配置,从而满足网站后期发展的需求;2、VPS用途广,能够直接生成网站程序,速度快、效率高;3、VPS独立性好,具备独立IP资源,有利于网站优化;4、VPS稳定性高,当独享V...
    99+
    2024-04-02
  • ClickHouse的优点有哪些
    本篇内容介绍了“ClickHouse的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Clic...
    99+
    2024-04-02
  • javascript的优点有哪些
    javascript的优点有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1).javascript的优点:javascript减少网络传输。在javas...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作