Javaassist
1、概述
1.1、开放源代码JBoss 应用服务器项目,一个开源的分析、编辑和创建Java字节码的类库;
1.2、特点:
简单,而且快速;
直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类;
2、案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | package com.an.bytecode.javaassist; import javassist.*; import java.io.File; import java.io.FileOutputStream; /** * @description: * @author: anpeiyong * @date: Created in 2020/4/7 11:25 * @since: */ public class JavaAssistTest { public static void main(String[] args) throws Exception { //CtClass对象容器 ClassPool classPool=ClassPool.getDefault(); //CtClass对象容器中创建一个public的JATest类 CtClass jATestClazz=classPool.makeClass( "com.an.bytecode.javaassist.JATest" ); //***属性操作 //JATest类中添加private int id CtField ctIdField= new CtField(classPool.getCtClass( "int" ), "id" ,jATestClazz); ctIdField.setModifiers(Modifier.PRIVATE); jATestClazz.addField(ctIdField); //JATest类中添加private String username CtField ctUserNameField= new CtField(classPool.getCtClass( "java.lang.String" ), "username" ,jATestClazz); ctUserNameField.setModifiers(Modifier.PRIVATE); jATestClazz.addField(ctUserNameField); //添加getter,setter方法 jATestClazz.addMethod(CtNewMethod.getter( "getId" ,ctIdField)); jATestClazz.addMethod(CtNewMethod.getter( "setId" ,ctIdField)); jATestClazz.addMethod(CtNewMethod.getter( "getUsername" ,ctUserNameField)); jATestClazz.addMethod(CtNewMethod.getter( "setUsername" ,ctUserNameField)); //添加构造函数 CtConstructor ctConstructor= new CtConstructor( new CtClass[]{},jATestClazz); //添加构造函数方法体 StringBuffer sb = new StringBuffer(); sb.append( "{\n" ).append( "this.id = 27;\n" ).append( "this.username=\"carl\";\n}" ); ctConstructor.setBody(sb.toString()); jATestClazz.addConstructor(ctConstructor); // 添加自定义方法 CtMethod method = new CtMethod(CtClass.voidType, "say" , new CtClass[]{}, jATestClazz); method.setModifiers(Modifier.PUBLIC); StringBuffer printSb = new StringBuffer(); printSb.append( "{\nSystem.out.println(\"begin!\");\n" ) .append( "System.out.println(id);\n" ) .append( "System.out.println(username);\n" ) .append( "System.out.println(\"end!\");\n" ) .append( "}" ); method.setBody(printSb.toString()); jATestClazz.addMethod(method); //生成一个Class对象 Class<?> clazz=jATestClazz.toClass(); Object object=clazz.newInstance(); //反射执行方法 clazz.getMethod( "say" , new Class[]{}).invoke(object, new Object[]{}); //将生成的class写入文件中 FileOutputStream fileOutputStream= new FileOutputStream( new File( "JATest.class" )); fileOutputStream.write(jATestClazz.toBytecode()); fileOutputStream.close(); } } |
posted on 2020-04-07 14:23 anpeiyong 阅读(1112) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)