大家好,我是冰河~~

字节码编程在实际的业务开发(CRUD)中并不常用,但是随着网络编程,RPC、动态字节码增强技术和自动化测试以及零侵入APM监控的不断发展与大量使用,越来越多的技术需要使用到字节码编程。

好了,我们今天就使用Javassist动态生成一个HelloWorld案例,相关的程序案例代码可以关注公众号:冰河技术 获取,也可以直接到Github和Gitee获取。

Github:https://github.com/binghe001/bytecode

Gitee:https://gitee.com/binghe001/bytecode

开发环境

  • JDK 1.8
  • IDEA 2018.03
  • Maven 3.6.0

Maven依赖

在项目的pom.xml文件中添加如下环境依赖。

<properties><javassist.version>3.20.0-GA</javassist.version>
</properties><dependencies><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>${javassist.version}</version></dependency>
</dependencies>

案例效果

整体案例效果其实也是很简单的,学习Java语言时,我们会在命令行打印第一个Hello World程序。今天,我们学习Javassist字节码编程时,也来实现一个HelloWorld程序。

案例的效果就是要生成如下的程序代码。

package io.binghe.bytecode.javassist.test;public class HelloWorld {public static void main(String[] var0) {System.out.println("Javassist Hello World by 冰河(公众号:冰河技术)");}public HelloWorld() {}
}

看看这个效果,像不像我们自己在IDEA中写的Java代码呢?就让我们一起使用Javassist来实现它吧。

案例实现

这个案例其实还是蛮简单的,这里就先直接给出源代码了。

/*** @author binghe (公众号:冰河技术)* @version 1.0.0* @description 测试使用Javassist生成第一个类HelloWorld*/
public class GenerateHelloWorldClass {/*** 创建HelloWorld的类,并返回HelloWorld的Class实例*/public static Class createHelloWorld()throws Exception{//使用默认的ClassPoolClassPool pool = ClassPool.getDefault();//创建一个空类CtClass ctClass = pool.makeClass("io.binghe.bytecode.javassist.test.HelloWorld");//添加一个main方法CtMethod ctMethod = new CtMethod(CtClass.voidType, "main", new CtClass[]{pool.get(String[].class.getName())}, ctClass);//将main方法声明为public static类型ctMethod.setModifiers(Modifier.PUBLIC + Modifier.STATIC);//设置方法体ctMethod.setBody("{" +"System.out.println(\"Javassist Hello World by 冰河(公众号:冰河技术)\");" +"}");ctClass.addMethod(ctMethod);//将生成的类的class文件输出的磁盘ctClass.writeFile();//返回HelloWorld的Class实例return ctClass.toClass();}public static void main(String[] args) throws Exception {Class clazz = createHelloWorld();Object obj = clazz.newInstance();Method mainMethod = clazz.getMethod("main", new Class[]{String[].class});mainMethod.invoke(obj, new String[1]);}
}

接下来,我们根据上述代码来看看Javassist是如何生成完整字节码的。

(1) 在createHelloWorld()方法中创建一个ClassPool,ClassPool本质上就是个CtClass对象容器。

(2) 调用ClassPool的makeClass()方法,传入完整的包名+类名生成一个空的类信息。这里传入的完整的包名+类名是io.binghe.bytecode.javassist.test.HelloWorld

(3) 给类添加方法,并设置方法的返回类型、方法名称、参数名(入参和出参)、访问修饰符以及方法体。这里设置的完整方法体如下:

public static void main(String[] var0) {System.out.println("Javassist Hello World by 冰河(公众号:冰河技术)");
}

(4) 尽管我们在上述代码中没有显示的创建无参构造函数,但是在编译时,Javassist会自动创建一个HelloWorld类的无参构造函数。

(5) 通过 CtClass的writeFile()方法将内存中的类信息输出到磁盘,这样我们就可以通过IDEA清晰的看到Javassist生成的HelloWorld类了。

(6) 最终在createHelloWorld()方法中调用CtClass的toClass()方法返回Class对象。

(7) 在main()方法中调用createHelloWorld()方法获取Class对象。

(8) 通过反射实例化对象,并通过反射调用生成的HelloWorld类的main()方法。

效果演示

运行GenerateHelloWorldClass类的main()方法,会在顶级工程目录下的io/binghe/bytecode/javassist/test 目录下生成HelloWorld.class文件,具体如下所示。

查看IDEA的输出信息时,发现会输出如下内容。

Javassist Hello World by 冰河(公众号:冰河技术)Process finished with exit code 0

案例总结

我们使用Javassist实现了创建一个HelloWorld类的功能,字节码编程听起来貌似挺难的,但是在Javassist强大的API下,实现起来还是蛮简单的。

在接下来的一段时间里,冰河会持续输出关于字节码编程的文章,让我们一起精通字节码编程。

好了,今天就到这儿吧,我是冰河,我们下期见~~

写在最后

如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~

推荐阅读:

  • 《实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!》
  • 《从零到上亿用户,我是如何一步步优化MySQL数据库的?(建议收藏)》
  • 《我用多线程进一步优化了亿级流量电商业务下的海量数据校对系统,性能再次提升了200%!!(全程干货,建议收藏)》
  • 《我用多线程优化了亿级流量电商业务下的海量数据校对系统,性能直接提升了200%!!(全程干货,建议收藏)》
  • 《我用10张图总结出了这份并发编程最佳学习路线!!(建议收藏)》
  • 《高并发场景下一种比读写锁更快的锁,看完我彻底折服了!!(建议收藏)》
  • 《全网最全性能优化总结!!(冰河吐血整理,建议收藏)》
  • 《三天撸完了MyBatis,各位随便问!!(冰河吐血整理,建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程知识是你必须要掌握的!完整学习路线!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些核心技能是你必须要掌握的!完整学习路线!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:这些计算机与操作系统基础知识越早知道越好!万字长文太顶了!!(建议收藏)》
  • 《我用三天时间开发了一款老少皆宜的国民级游戏,支持播放音乐,现开放完整源代码和注释(建议收藏)!!》
  • 《我是全网最硬核的高并发编程作者,CSDN最值得关注的博主,大家同意吗?(建议收藏)》
  • 《毕业五年,从月薪3000到年薪百万,我掌握了哪些核心技能?(建议收藏)》
  • 《我入侵了隔壁妹子的Wifi,发现。。。(全程实战干货,建议收藏)》
  • 《千万不要轻易尝试“熊猫烧香”,这不,我后悔了!》
  • 《清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!》
  • 《7.3万字肝爆Java8新特性,我不信你能看完!(建议收藏)》
  • 《在业务高峰期拔掉服务器电源是一种怎样的体验?》
  • 《全网最全Linux命令总结!!(史上最全,建议收藏)》
  • 《用Python写了个工具,完美破解了MySQL!!(建议收藏)》
  • 《SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)》
  • 《MySQL 8中新增的这三大索引,直接让MySQL起飞了,你竟然还不知道!!(建议收藏)》
  • 《撸完Spring源码,我开源了这个分布式缓存框架!!(建议收藏)》
  • 《亿级流量高并发秒杀系统商品“超卖”了,只因使用的JDK同步容器中存在这两个巨大的坑!!(踩坑实录,建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)》
  • 《公司的报表工具太难用,我三天撸了个Excel工具,运营小姐姐直呼太好用了,现已开源!!(建议收藏)》
  • 《奉劝那些刚参加工作的学弟学妹们:要想进大厂,这些并发编程核心技能是你必须要掌握的!!(建议收藏)》
  • 《阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)》
  • 《Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏)》

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是冰河,我们下期见~~

字节码编程 | 使用Javassist动态生成Hello World相关推荐

  1. 字节码编程,Javassist篇三《使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 通过前面两篇 javassist 的基本内容,大体介绍了:类池(ClassPool) ...

  2. 字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 案例是剥去外衣包装展示出核心功能的最佳学习方式! 就像是我们研 ...

  3. 牛散村:Java字节码编程javassist的详细介绍

    本篇文章将和大家分享一下关于Java字节码编程中一个非常之好用的技术javassist,下面将详细为大家介绍一下javassist技术,以及具体实例代码讲解. 一.Javassist入门 (一)Jav ...

  4. aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...

    作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...

  5. 字节码编程 | 工作多年的你依然重复做着CRUD?是否接触过这种技术?

    大家好,我是冰河~~ 最近和不少小伙伴聊天,发现大部分小伙伴,其中可能就包括正在看文章的你和我,工作时间已经不短了,有些小伙伴工作3~5年了,有些甚至超过8年了. 但是大部分小伙伴平时的工作都是在简单 ...

  6. ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时

    作者:小傅哥 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了多少代码 ...

  7. ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出

    作者:小傅哥 博客:https://bugstack.cn Wiki:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有所收 ...

  8. Java字节码编程之非常好用的javassist

    我为什么要研究这个? 因为我在开发一个框架的时候需要用到. 我开发的这个框架,有一个注解,当用户输入变量名,类名的时候,我这个框架可以为其自动生成一个对象,并加载到内存中供以后使用. 这个小功能可费尽 ...

  9. java修改字节码技术,Javassist修改class,ASM修改class

    背景: 项目使用的Logback 1.1.11版本的类ch.qos.logback.core.rolling.helper.RollingCalendar的periodBarriersCrossed方 ...

最新文章

  1. S6 edge+的多米诺骨牌效应:大屏的趋势
  2. python从入门到精通视频百度云资源_python从入门到精通视频(全60集)声音修复版...
  3. 深究AngularJS——排序
  4. C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别
  5. nginx php7 win,Win7配置Nginx+PHP7
  6. python组件的react实现_【React源码解读】- 组件的实现
  7. 关于游戏网络设计的问题
  8. [零基础学JAVA]Java SE面向对象部分-17.面向对象高级(05)
  9. Web后端学习笔记 Flask(4)视图函数
  10. 两数据库Dblink数据抽取blob
  11. 2018年区块链五大关键趋势预测:区块链与物联网结合有望突破
  12. QT全局钩子监控鼠标和键盘
  13. 冥王星P的编曲日志《时光的眼泪》
  14. 如何查看内存条的实际使用频率
  15. 大数据日志分析Hadoop项目实战
  16. vlan的端口隔离及端口优化——“道高一尺魔高一丈”
  17. 三维重建KInectFusion 学习笔记
  18. windows 时间同步工具软件
  19. 两万字,清华刘云浩教授回答新生关于AI的90个问题
  20. python反爬虫原理与绕过实战pdf-antispider

热门文章

  1. 时间频度和时间复杂度
  2. 计算机组成原理常见题(四)
  3. Cesium交流群链接
  4. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...
  5. 使用Excel的VBA简单语句处理循环、判断等操作
  6. 一款可视化在线图表工具
  7. 如何统计项目的代码行数
  8. STM32的SG90舵机驱动
  9. 移动端(iOS,android)上那些炒股软件的K线图,分时图,都是怎么实现的?
  10. 使用ZBrush软件的画布功能有什么技巧吗?