
正文
5.1 javassist基本使用
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
假设要使用javassist创建一个类:
package com.alibaba.dubbo.demo.test;
public class Emp {
//属性
private int account;
private String name;
//构造方法
public Emp() {
this.account = 1;
this.name = "xiaona";
}
//getter
public int getAccount() {
return account;
}
//setter
public void setAccount(int account) {
this.account = account;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//普通方法
public void commonMethod() {
System.out.println("haha");
}
}
该类包含属性/构造方法/getter/setter/普通方法。
使用javassist来创建类:
package com.alibaba.dubbo.demo.test; import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Modifier; import java.io.File;
import java.io.FileOutputStream; public class TestJavassitCompiler {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("com.alibaba.dubbo.demo.test.Emp");
//添加属性:private String name
CtField nameField = new CtField(pool.getCtClass("java.lang.String"), "name", ctClass);
nameField.setModifiers(Modifier.PRIVATE);
ctClass.addField(nameField);
//添加属性:private int account
CtField accountField = new CtField(pool.getCtClass("int"), "account", ctClass);
accountField.setModifiers(Modifier.PRIVATE);
ctClass.addField(accountField);
//getter和setter
ctClass.addMethod(CtNewMethod.getter("getName", nameField));
ctClass.addMethod(CtNewMethod.setter("setName", nameField));
ctClass.addMethod(CtNewMethod.getter("getAccount", accountField));
ctClass.addMethod(CtNewMethod.setter("setAccount", accountField));
//创建构造器
CtConstructor ctConstructor = new CtConstructor(new CtClass[] {}, ctClass);
String body = new StringBuilder("{\nthis.account = 1;\nthis.name = \"xiaona\";\n}").toString();
ctConstructor.setBody(body);
ctClass.addConstructor(ctConstructor);
//普通方法
CtMethod ctMethod = new CtMethod(CtClass.voidType, "commonMethod", new CtClass[] {}, ctClass);
ctMethod.setModifiers(Modifier.PUBLIC);
ctMethod.setBody(new StringBuilder("{\n System.out.println(\"haha\"); \n}").toString());
ctClass.addMethod(ctMethod); Class<?> clazz = ctClass.toClass();
Object obj = clazz.newInstance();
obj.getClass().getMethod("commonMethod", new Class[] {}).invoke(obj, new Object[] {});//方法调用 /**
* 将字节码输出到文件中
*/
byte[] codeByteArray = ctClass.toBytecode();
FileOutputStream fos = new FileOutputStream(new File("/Users/jigangzhao/Desktop/Emp.class"));
fos.write(codeByteArray);
fos.close();
}
}
之后可以使用javap命令来看一下/Users/jigangzhao/Desktop/Emp.class文件。
关于javassit的API请查看:
https://github.com/jboss-javassist/javassist/wiki/Tutorial-1






