字节码操作、javassist使用

2020-02-25 16:04:23来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

字节码操作、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() {
	}
}

  


原文链接:https://www.cnblogs.com/lhl0131/p/12360589.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Tomcat 核心配置

下一篇:Java线程池学习总结