zoukankan      html  css  js  c++  java
  • 字节码操作、javassist使用

    一、功能

    1、动态生成新的类

    2、动态改变某个类的结构(添加、删除、修改   新的属性、方法)

    二、优势

    1、比反射开销小,性能高

    2、JAVAasist性能高于反射,低于ASM


    使用javassist生成一个新的类

    javassist入门:

    package cn.lhl.test;
    
    import javassist.CannotCompileException;
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtConstructor;
    import javassist.CtField;
    import javassist.CtMethod;
    
    /**
     * 测试使用javassist生成一个新的类
     * 
     * @author Administrator
     *
     */
    public class Demo01 {
    	public static void main(String[] args) throws Exception {
    		ClassPool pool = ClassPool.getDefault();
    		CtClass cc = pool.makeClass("cn.lhl.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);
    		
    		//添加构造器
    		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);
    		
    		//将上面构造好的类写入到f:/myjava中
    		cc.debugWriteFile("f:/myjava");
    		System.out.println("生成类");
    	}
    }

     

    emp类:

    package cn.lhl.test;
    
    public class Emp {
    	
    	private int empno;
    	private String ename;
    	
    	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() {
    	}
    }
    

      

  • 相关阅读:
    电脑麦克风不能用
    MathType中带上下标字符不对其
    Visio显示不完整
    程序员美食-煎豆腐
    Visio画好的图在word中只显示一部分
    Visio中旋转文本框与箭头平行
    Tikhonov regularization和岭回归
    linux下使用sftp
    git cherry-pick. 如何把已经提交的commit, 从一个分支放到另一个分支
    python 操作消息队列
  • 原文地址:https://www.cnblogs.com/lhl0131/p/12360589.html
Copyright © 2011-2022 走看看