尚学堂 216 java中的字节码操作

所谓的字节码操作就是操作我们已经加载的字节码

接下来我们重点来讲解javaassist类库

使用需要下载jar包,把jar包添加到对应的工程之后

package com.bjsxt.test;


public class Emp {
    
    private int empno;
    private String ename;
    
    public void sayHello(int a){
        System.out.println("sayHello,"+a);
    }
    
    public int getEmpno() {
        return empno;
    }
    public void setEmpno(int empno) {
        this.empno = empno;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    
    public Emp(int empno, String ename) {
        super();
        this.empno = empno;
        this.ename = ename;
    }
    
    public Emp() {
    }
}

我们使用javaAssit工具手动的创建一个Emp .class文件

我们来看程序的代码

package com.bjsxt.test;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;

/**
 * 测试使用javassist生成一个新的类
 * @author 尚学堂高淇 www.sxt.cn
 *
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.makeClass("com.bjsxt.bean.Emp");
        
        //创建属性
        CtField f1 = CtField.make("private int empno;", cc);
        CtField f2 = CtField.make("private String ename;", cc);
        cc.addField(f1);
        cc.addField(f2);
        
        //创建方法
        CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", cc);
        CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", cc);
        cc.addMethod(m1);
        cc.addMethod(m2);
        
        //添加构造器
        /*
         * CtClass.intType,pool.get("java.lang.String 构造函数的int和string类型
        */
        CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, cc);
        constructor.setBody("{this.empno=empno; this.ename=ename;}");
        cc.addConstructor(constructor);
        
        cc.writeFile("c:/myjava"); //将上面构造好的类写入到c:/myjava中
        System.out.println("生成类,成功!");
    }
}

我们运行上面的代码,就在c盘生成了 一个Emp .class文件

原文地址:https://www.cnblogs.com/kebibuluan/p/7285351.html