1.前言字节码编程常用的框架有3种;段代码进行操作,但操作方式和控制粒度不同。其中ASM更偏向于底层,需要了解JVM虚拟机中的指定规范以及局部变量和操作数栈的知识。虽然写起来比较麻烦,但也是目前性能最好、功能最强大的字节码操作框架。常用于CGLIB动态代理类,以及一些非侵入式探针监控场景。另外两个框架都有强大的API,在运行和使用上更容易控制。虽然对比起来性能会比ASM差一些,但并不代表性能一点都不好。在一些监控场景中也用的比较多。细心的可以在自己的项目jar包中搜索一下。在此之前,我写过一些关于Javaagent全链路监控和ASM的文章。虽然这部分技术内容在CRUD开发中并不常用,但是随着自动化测试和无创监控的广泛使用,很多人还是需要学习这方面的技能。同时,我也是这样一门技能的学习者,所以我会陆续撰写和完善关于字节码编程的专栏。也希望本专栏能在提升自己技术栈的同时帮助其他人成长。然后付哥打算完成从Javassist到ASM的一整套专栏学习文章的编写。从简单入门到应用操作,一步步完成系统的技术知识栈学习。好的!,现在开始第一个Helloworld案例。相关源码可通过以下公众号获得:bugstack虫洞栈2.开发环境JDK1.8.0javassist3.12.1.GAjavassistjavassist3.12.1.GAjar三、案例目标如果不看实现过程,我们的案例目标其实很简单,就是使用javassist输出一行Helloworld。这听起来像产品所说的吗?publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("javassisthihelloworldbyXiaoFu(bugstack.cn)");}publicHelloWorld(){}}上面的代码是我们接下来需要使用字节码编程技术实现的。4.技术实现其实输出一个Helloworld还是很简单的。主要目的是从这里学习Javassist的基本语法结构,也对后续的学习有一个基本的概念。javassistHelloworld/***公众号:bugstack虫洞栈*博客栈:https://bugstack.cn-沉淀,分享,成长,让自己和他人有所收获!*本专栏是小傅多年来在互联网Java开发一线的学习历程和技术总结,旨在为您提供清晰详尽的学习教程。如果对您有帮助,请多多支持(关注、点赞、分享)!*/publicclassGenerateClazzMethod{publicstaticvoidmain(String[]args)抛出IOException、CannotCompileException、NotFoundException、IllegalAccessException、InstantiationException、NoSuchMethodException、InvocationTargetException{ClassPoolpool=classPool.getDefaultNameCtClassctClass=pool.makeClass("org.itstack.演示.javassist.HelloWorld");//添加方法CtMethodmainMethod=newCtMethod(CtClass.voidType,"main",newCtClass[]{pool.get(String[].class.getName())},ctClass);mainMethod.setModifiers(Modifier.PUBLIC+Modifier.STATIC);mainMethod.setBody("{System.out.println(\"javassisthihelloworldby付哥(bugstack.cn)\");}");ctClass.addMethod(mainMethod);//创建无参数构造函数CtConstructorctConstructor=newCtConstructor(newCtClass[]{},ctClass);ctConstructor.setBody("{}");ctClass.addConstructor(ctConstruct或者);//输出类内容ctClass.writeFile();//测试调用Classclazz=ctClass.toClass();对象obj=clazz.newInstance();方法main=clazz.getDeclaredMethod("main",String[].class);main.invoke(obj,(Object)newString[1]);}}这段代码分为几个部分来实现功能,包括;创建ClassPool,这是一个基于HashMap的CtClass对象容器,使用CtClass,创建我们的类信息,也就是类的路径和名称。下一步是向类中添加方法。包括;方法属性、类型、名称、输入参数、输出参数和方法体的内容。创建方法后,需要创建一个空的构造函数,每个类编译后都会生成这样一个构造函数。在创建方法时,我们使用ctClass.writeFile()输出方法的内容信息。您还可以看到通过我们使用Javassist生成类的情况。最后,我们的反射调用main方法来测试输出。5.测试结果当我们执行测试时,类信息会输出到项目文件夹中,同时输出我们的测试结果;1.Javassist生成的类在项目文件夹下2.输出测试结果javassisthihelloworldbyLittleFu(bugstack.cn)Processfinishedwithexitcode06.总结关于Javassist在完整强大的API下的使用,它确实很容易使用。而且代码的使用也不是很难理解。