javassit学习笔记入门

转载请说明出处。

首先导入javassit的jar包 下面是我练习时用的jar包

<dependency>

<groupId>javassist</groupId>

 <artifactId>javassist</artifactId>

<version>3.12.1.GA</version>

</dependency>

 

基础入门的例子

ClassPool pool = ClassPool.getDefault();

//创建class文件

 CtClass userClass = pool.makeClass("com.jjn.entity.User");

//创建id属性 创建name属性

CtField idField = CtField.make("private Integer id;", userClass);

CtField nameField = CtField.make("private String name;", userClass);

//添加属性
 userClass.addField(idField);
 userClass.addField(nameField);

//创建方法

CtMethod getIdMethod = CtMethod.make("public Integer getId() {return id;}", userClass);

CtMethod setIdMethod = CtMethod.make("public void setId(Integer id) { this.id=id; }", userClass);

CtMethod getNameMethod = CtMethod.make("public String getName() { return name; }", userClass);

CtMethod setNameMethod = CtMethod.make("public void setName(String name) { this.name=name; }", userClass);

//添加方法

userClass.addMethod(getIdMethod);
userClass.addMethod(setIdMethod);
userClass.addMethod(getNameMethod);
userClass.addMethod(setNameMethod);

//添加构造器

CtConstructor ctConstructor=new CtConstructor( new CtClass[] {
                CtClass.intType,pool.get("java.lang.String")
        },userClass);

//创建body
 ctConstructor.setBody("{this.id=id;this.name=name;}");
 userClass.addConstructor(ctConstructor);
 //将构造好的类写入到D:\test目录下
 userClass.writeFile("D:/test");

一些基本的API使用  修改方法的内容 实现前置增强 后置增强

注意当CtClass 调用writeFile()、toClass()、toBytecode() 这些方法的时候,Javassist会冻结CtClass Object,对CtClass object的修改将不允许。这个主要是为了警告开发者该类已经被加载,而JVM是不允许重新加载该类的。如果要突破该限制,方法如下:userClass.defrost();

ClassPool pool = ClassPool.getDefault();

//加载类的信息
 CtClass userClass = pool.get("com.itmayiedu.Demo01");

CtMethod ctMethod1 =CtMethod.make("public int add(int a,int b){  System.out.println(\"  User1  \");\n return a+b;}", userClass);
        userClass.addMethod(ctMethod1);
        userClass.writeFile("D:/test");
        userClass.defrost();

/方法执行前插入
        CtMethod cm = userClass.getDeclaredMethod("add", new CtClass[]{CtClass.intType,CtClass.intType});
        cm.insertBefore("System.out.println($1=3);System.out.println(\"....start....\");");
        //方法执行后插入
        cm.insertAfter("System.out.println(\"...end...\");");

//使用反射技术执行代码
        Class clazz = userClass.toClass();
        Object newInstance = clazz.newInstance();
        Method method = clazz.getDeclaredMethod("add", int.class,int.class);
        Object obj = method.invoke(newInstance, 2,2);
        System.out.println(obj);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值