【这是一猿小讲的第 26 篇原创分享】

1.

这篇文章想分享已经很久了,苦于皱巴巴的技术比较生涩难懂,迟迟没有找到好的分享方式,今天结合爱情中暗送秋波的故事的形式,尝试分享一下。

以后如果再有人问你们:能否在加载类的时候,对字节码进行修改?如何实现零侵入、松耦合的方式,采集 Java 程序的各种运行信息?等等一系列的问题时,请不要再懵圈摇头,尝试结合下面分享的爱情故事,回答一下也未尝不可。

准备好小板凳,爱情故事要开始啦。

2.

自从 Java 那小子靠《爱情36技之追美妹的技术》喜获 Python 菇凉的芳心后,就开始与 Python 菇凉一起进行着各种浪漫的旅行。

Java 先带着心爱的 Python 菇凉去了一趟浪漫的土耳其,然后一起又去了东京和巴黎,其实 Java 特别喜欢迈阿密,和有黑人的洛杉矶,但是 Python 菇凉还是比较想去云南的大理,在云南大理的天涯海角来个海枯石烂、海誓山盟,这样保留着回忆才更有意义。于是让 Java 那小子订了两张 9012 年 7 月 4 日的飞往云南大理的机票。

往往计划赶不上变化,Java 那小子所在的公司要组织晋升培训,为了能让 Python 菇凉以后的生活更惬意,Java 那小子决定不去云南大理了,但是还想让 Python 菇凉独自去欣赏一下大理的美景。

Java 那小子还实在放心不下 Python 菇凉,担心她坐飞机是否安全?担心她独自一人是否会难过?

有没有一种方式能够实时关注到她的动态呢?只有知道 Python 菇凉的动态,Java 那小子才能安心工作,才能时不时的送去爱意的秋波。

好奇、郁闷、纠结的 Java,遂拿起压箱底的《爱情36技》捣腾了好一会儿,忽然捣腾第 34 技——暗送秋波的技术,Java 眼前一亮,心中乐开了花。

Java 那小子结合自身需求,认真展开了对《爱情 36 技》中的暗送秋波攻略使用解读。

暗送秋波的技术攻略,谨献给那些:想实时关心对方的动态,时不时还想再来个嘘寒问暖的小哥哥小姐姐们。不过此良策说的好听一点是关心对方,说的不好听一点那就是监控对方(捂嘴笑)。

首先声明此良策,需要为对方亲手打造一款随身携带的设备,需要耗费人力财力... ...

认真读完攻略,Java 下意识的认为,需要先给将要打造的随身携带的设备起个名字,以彰显自己的才能,并能让 Python 菇凉欣然接受这个设备。

Java 灵光乍现,由于设备出自我之手,肯定名字也要随着我的姓,不妨就取个卡哇伊的中文名字为:Java 的随身听,英文名字:JavaWalkmanAgent,学名为:javaagent

考虑到 Python 菇凉远行,不能携带太重的行李。于是 Java 按照书中的步骤,绞尽脑汁,一步一步的开始为 Python 菇凉打造这款便捷小巧的随身听设备。

第一步:确定要把秋天的菠菜送给谁


Java 准备把亲身打造的随身听设备,送给 Python 菇凉。其中 Python 菇凉去大理会经历两件事,一件事是坐飞机去大理,另一件是去天涯海角来一场浪漫的海誓山盟。

package com.love36.ogle;    public class PythonGirl {   public static void goByPlane() {    System.out.println("Python 菇凉说==> 我心爱的Java没有一起坐飞机,心中还是有点失落"); }   public static void sayLoveOath() {  System.out.println("Python 菇凉说==> Java没来大理有遗憾,但是海可枯石可烂,我对他的爱情永不变");    }   public static void main(String[] args) {    System.out.println("随身听 设备说==> 我是 Java 制作的随身听设备,专门替 Java 照顾 Python 菇凉,并默默暗送秋波");  // 1. 坐飞机去大理浪漫  goByPlane();    // 2. 一个人的山盟海誓  sayLoveOath();  }
}

第二步:用心打造暗送秋波设备的骨架


在 Python 菇凉做每件事之前,JavaWalkmanAgent 都会第一时间拦截到。

第三步:伺机而动。


Java 提前种植好情意绵绵、嘘寒问暖的菠菜,然后在 Python 菇凉做每件事之前或者之后默默送过去。

package com.love36.ogle;  import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;  import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;  public class JavaWalkmanAgent { public static void premain(String agentArgs, Instrumentation inst) {    System.out.println("随身听 设备说==> 我是 Java 制作的随身听设备,专门替 Java 照顾 Python 菇凉,并默默暗送秋波");  // 随身听开始发挥自己的作用吧    inst.addTransformer(new ClassFileTransformer() {    @Override  public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,   ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { byte[] transformed = null; CtClass cl = null; try {   ClassPool pool = ClassPool.getDefault();   cl = pool.makeClass(new java.io.ByteArrayInputStream(classfileBuffer));    if (!cl.isInterface()) {    CtMethod[] methods = cl.getDeclaredMethods();  for (int i = 0; i < methods.length; i++) {    CtMethod method = methods[i];  //随身听发现 Python 菇凉正在坐飞机,提醒系好安全带  if ("com.love36.ogle.PythonGirl.goByPlane()".equals(method.getLongName())) {  //在 Python 菇凉坐飞机之前问候一下  method.insertBefore("System.out.println(\"Java 那小子说==> 心爱的Python,飞机要起飞了,请系好安全带,一路平安。\");");   //在 Python 菇凉坐飞机之后慰问一下  method.insertAfter("System.out.println(\"Java 那小子说==> 心爱的Python,安全抵达大理,愿玩的开心。\");"); }   //随身听发现 Python 菇凉正在海誓山盟,Java远程寄相思   if ("com.love36.ogle.PythonGirl.sayLoveOath()".equals(method.getLongName())) {    //在 Python 菇凉海誓山盟之后再补充一下    method.insertAfter("System.out.println(\"Java 那小子说==> 我心爱的Python," +    "虽然未能一起去大理的天涯海角浪漫,但是我的心却始终在你身边,注意回来的时候买点土特产(捂嘴笑)。\");"); }   }   transformed = cl.toBytecode(); }   } catch (Exception e) { System.err.println("随身听 设备说==> 我只照顾像Python这样的姑娘,老爷们就不要硬往上凑了。");   } finally { if (cl != null) {  cl.detach();    }   }   return transformed; }   }); }
}

第四步:为暗送秋波的随身听设备提供配置手册。

Manifest-Version: 1.0
Premain-Class: com.love36.ogle.JavaWalkmanAgent
Boot-Class-Path: /app/love36/lib/javassist-3.16.1-GA.jar

至此,暗送秋波的随身听设备在 Java 那小子用心打造下完成了,只见 Java 那小子轻轻松松的在开发工具上把上面做的一切合成到一起,导出了 walkman.jar。

Java 已经忍不住想一键启动,暗送秋波的随身听设备,看看有没有达到预期的效果。于是 Java 在心中默默输入如下命令。

java -javaagent:walkman.jar com.love36.ogle.PythonGirl

结果确实让 Java 那小子很惊喜,因为在没有打扰 Python 菇凉的行程下,Java 那小子也完成了对 Python 菇凉的暗送秋波,嘘寒问暖。

锻炼视力的时候到了,睁大眼睛看效果。

视力不好,那我们再放大一点看,居然 Java 那小子无时无刻不在关心着 Python 姑娘,确实挺神奇。

3.

故事讲完了,暗送秋波的攻略你 get 到了没?容我们用技术的行话再来总结一下。

暗送秋波是指:通过 javaagent 植入代码的方式,松耦合的完成目标对象的字节码修改。

经常使用场景:在方法体前后加入统计方法耗时的代码段;统计 SQL 耗时;最重要的是实现调用链路跟踪;许多 APM 开源轮子,比如 Pinpoint、SkyWalking 等,就是使用这项技术对代码进行的增强。

题外话:其实我在面试别人的时候,偶尔也会谈到这个知识点,因为可以考察一下求职者有没有相关解决思路以及技术的深度。

好了,今天的故事就讲完了,希望对你们有帮助。

推荐阅读:

爱情36技之追美妹的技术

一篇文章讲透线上应用监控

【Java技术系列】爱情36技之暗送秋波的技术相关推荐

  1. 【Java技术系列】爱情36技之猿门授渔

    上面蓝色"一猿小讲"点击加关注 觉得好看,记得再设置"星标"哦 [这是一猿小讲的第 29 篇原创分享] 1. 授人以鱼,不如授人以渔.就用上面两张图片展开今天的 ...

  2. 【Java技术系列】爱情36技之记忆永存

    [这是一猿小讲的第 32 篇原创分享] 1.  关注"一猿小讲"公众号的伙伴们都清楚,Java 那小子带着心爱的 Python 菇凉,去了一趟浪漫的土耳其,然后一起又去了东京和巴黎 ...

  3. 【Java技术系列】爱情36技之趣味相投

    [这是一猿小讲的第 27 篇原创分享] 1. 鲁迅先生曾经说:两个人志同道合,爱情才能走得长久. 我们老百姓常说:磨刀不误砍柴工:工欲善其事必先利其器. 准备好小板凳,今天的故事就从这两句不搭边的话开 ...

  4. 【Java技术系列】爱情36技之Bug大战

    [这是一猿小讲的第 28 篇原创分享] 1. 鲁迅先生说:程序员,天不怕地不怕,就怕小虫儿爬呀爬,爬呀爬. 随着时间的推移,鲁迅先生又说:真正勇猛的程序员,敢于让虫子面对惨淡的虫生. 虫子在程序员心中 ...

  5. 爱情36技之记忆重生

    [这是一猿小讲的第 72 篇原创分享] 今天一位跨界老码农不知咋回事,兴奋过了头,一不小心把数据库给删掉啦,然后问我咋恢复,然后我告诉他基于 binlog 可以恢复,谁成想没有开启 binlog,最后 ...

  6. 爱情36技之一劳永逸

    [这是一猿小讲的第 41 篇原创分享] 今天雅兴又起,再续爱情36技.大概率你们已经淡忘了 Java 那小子与 Python 菇凉浪漫的爱情故事,容我再帮着给大家回味一下. Java 那小子先是靠着& ...

  7. 【Java技术系列】爱情36技之追美妹的技术

    [这是一猿小讲的第 25 篇原创分享] 1. 在古老的非洲大陆上,有个原始人无意中抬头仰望星空,凝视的时间稍微长了一些,超过了外星人设置的阈值,立刻拉响了人类即将产生文明的警报.因为外星人认为,人类已 ...

  8. 技术系列课|AI驱动的超分辨技术应用现状

    基于AI的超分辨(Super Resolution)技术在图像恢复和图像增强等领域展现出广阔的应用前景,受到学术界和工业界的关注和重视.但是,在RTC领域中,很多算法并不能满足实际场景下的应用需求,超 ...

  9. 【OCR技术系列之五】自然场景文本检测技术综述(CTPN, SegLink, EAST)

    文字识别分为两个具体步骤:文字的检测和文字的识别,两者缺一不可,尤其是文字检测,是识别的前提条件,若文字都找不到,那何谈文字识别.今天我们首先来谈一下当今流行的文字检测技术有哪些. 文本检测不是一件简 ...

最新文章

  1. 机器学习中的数学意义
  2. 神经网络的核裂变模型
  3. mysql用户数据导入_MySQL添加用户、删除用户与授权和数据的导入导出
  4. 测试教程网.unittest教程.7. 各种断言方法
  5. cacti安装和配置 技术交流群:146510248
  6. java关于贪吃蛇的源代码_完整的贪吃蛇(蛇吃蛋)Java源代码
  7. UnityShader19.1:渲染纹理(下)之GrabPass
  8. cisco 模拟器安装及交换机的基本配置实验心得_看完这份1113页的TCP/IP协议+路由与交换机,成功上岸字节跳动...
  9. 【word论文排版教程1】页面设置
  10. Exce如何行内随机排序确定出场顺序
  11. 服务器msdtc没有安全显示项,MSDTC 疑难解答
  12. 王笑京:国家新一代智能交通框架与实施进展
  13. sunlight的中文_DianaVickersSunlight中文歌词
  14. 用户旅程图进阶:实操与模板
  15. 流程图详解 new String(“abc“) 创建了几个字符串对象
  16. vue 怎么解析xml
  17. Mac软件破解版下载地址
  18. 如何将pdf转换成jpg图片的格式
  19. Unity录音并保存成wav文件或者byte[]字节数组
  20. (前端)html与css css 18、清除浮动,溢出隐藏

热门文章

  1. C++中的map问题+unordered_map问题
  2. NVIDIA驱动安装和更新
  3. 转载 高德瓦片Url解析
  4. semargl 软件使用方法简介
  5. java - FileUtils类
  6. 华为OD机试题 - 自动曝光(JavaScript)| 机考必刷
  7. 做节能减排的企业怎么申请碳中和服务认证?
  8. Microsoft365与Office到底啥区别?如何选择下载安装哪个版本?
  9. Css面试题整理及解答
  10. LDA算法入门(转)