06_javassist
【简述】
Javassist是一个开源的java字节码操作工具,主要是对已经编译好class文件进行修改和处理,可以直接检查、修改、创建 java类。
【javassist实例】
package com.javassist; import javassist.*; import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; /**
* Created by cuixinjie on 2018/9/7.
*/
public class JavassistTest { public static void main(String[] args) throws Exception {
//ClassPool:ctClass对象的容器
ClassPool pool = ClassPool.getDefault();
//通过ClassPool深沉给一个public的新类 User.java
CtClass ctClass = pool.makeClass("com.javassist.User"); //添加属性,首先添加age属性:private Integer age;
CtField ageField = new CtField(pool.getCtClass("java.lang.Integer"), "age", ctClass);
ageField.setModifiers(Modifier.PRIVATE);
ctClass.addField(ageField); //添加属性,其次添加phone属性:private String phone;
CtField phoneField = new CtField(pool.getCtClass("java.lang.String"), "phone", ctClass);
phoneField.setModifiers(Modifier.PRIVATE);
ctClass.addField(phoneField); //为age和phone添加getXxx/setXxx方法
ctClass.addMethod(CtNewMethod.getter("getAge", ageField));
ctClass.addMethod(CtNewMethod.setter("setAge", ageField));
ctClass.addMethod(CtNewMethod.getter("getPhone", phoneField));
ctClass.addMethod(CtNewMethod.setter("setPhone", phoneField)); //添加构造方法
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
//为构造方法添加方法体
StringBuffer buffer1 = new StringBuffer();
//注意:this.age = ($w)18这里加上$w,因为age是Integer类型,是一个包装类,$w代表一个包装类型
buffer1.append("{\nthis.age = ($w)18;\nthis.phone = \"15966668888\";\n}");
ctConstructor.setBody(buffer1.toString());
//把构造方法添加到新的类ctClass中
ctClass.addConstructor(ctConstructor); //添加自定义方法
CtMethod ctMethod = new CtMethod(CtClass.voidType, "printInfo", new CtClass[]{}, ctClass);
//为自定义的方法设置方法体
StringBuffer buffer2 = new StringBuffer();
buffer2.append("{\nSystem.out.println(\"I can get Alibaba's offer!\");\n");
buffer2.append("System.out.println(\"my age is \"+age);\n");
buffer2.append("System.out.println(\"my phone is \"+phone);\n");
buffer2.append("}");
ctMethod.setBody(buffer2.toString());
ctClass.addMethod(ctMethod); //生成一个Class对象
Class<?> clazz = ctClass.toClass();
Object instance = clazz.newInstance();
//反射 执行方法
Method method = instance.getClass().getMethod("printInfo", new Class[]{});
method.invoke(instance,null); // 把生成的class文件写入文件
byte[] byteArr = ctClass.toBytecode();
FileOutputStream fos = new FileOutputStream(new File("./User.class"));
fos.write(byteArr);
fos.close();
}
}
【运行结果】

06_javassist的更多相关文章
随机推荐
- 7. JavaScript学习笔记——DOM
7. DOM 7.1 DOM简介 DOM是文档对象模型,HTML文档的所有内容都是节点: 整个文档是一个文档节点 (document 最顶级) HTML元素内的文本是文本节点 每个表面的属性是属性节点 ...
- python四则运算2.0
github项目地址: https://github.com/kongkalong/python PSP 预估耗时(分钟) Planning .Estimate 48*60 Development . ...
- js 常用基本知识
Object.isObject = function(obj){ return obj != null && typeof obj === 'object' && Ar ...
- Git命令之回退篇 git revert git reset
Git command之回退篇 欲练回退 必先了解:HEAD.index.WorkingCopy HEAD: 当前所在的分支版本顶端的别名,也就是最新的一次commit. git commit 之后与 ...
- ajax乱码的问题
ajax 乱码情况与原因很多,本文只讲其中之一: 浏览器端正常的数据,用ajax提交到服务器上就乱码了. 当ajax的提交方式是get而不是post时,其所携带的数据不会被字符编码过滤器所拦截(事实上 ...
- LoadRunner性能测试结果分析(转载)
性能测试的需求指标:本次测试的要求是验证在30分钟内完成2000次用户登录系统,然后进行考勤业务,最后退出,在业务操作过程中页面的响应时间不超过3秒,并且服务器的CPU使用率.内存使用率分别不超过75 ...
- 用vue建新项目的过程---在工作中
1.git clone 项目地址 2.如果没装vue-cli,就先装下vue-cli (如果报错可能是没按管理员身份安装) 3.vue init webpack 项目名 4.安装项目依赖 npm i ...
- Android创建定时和周期任务
问题:应用需要按时执行某个操作,例如定时更新UI. 解决方案:使用Handler提供的定时操作功能.通过Handler,可以在指定的时间或是指定的延时后执行操作. 下面看一个在TextView中显示当 ...
- Android Gson解析复杂Json
JSON原数据 {"total":1,"rows":[{"ID":1,"Title":"台州初级中学招收初一年 ...
- Maven 常见知识点整理
认识 Maven Maven 的作用? 1.添加第三方jar包 2.解决jar包之间的依赖关系 3.获取第三方jar包 4.将项目拆成多个工程模块 Maven 是什么? 是Apache软件基金会组织维 ...