javassist能动态生成实体对象,或将java对象以class形式输出,它也可以动态的将数据表在内存中转化为对象,供我们使用,不用每次使用类加载器加载,具有提高数据处理效率的作用,javassist的缺点就是占用内存较多,如果这个类使用的频率非常大,就可以使用javassist,看看如何使用吧。
1.首先在maven中引入javassist的jar包,如果不是maven项目,则加入javassist-3.12.1.GA.jar包
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
2.我们要在内存中生成如下的Student实体类对象,该怎么做呢?先看看效果。
public class Student {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
public String getAge() {
return age;
}
public void setEno(String age) {
this.age= age;
}
//添加一个自定义方法
public void printInfo(){
System.out.println("over!");
}
}
3.javassist生成实体的方法,代码如下。
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtNewMethod;
import javassist.Modifier;
public class CreateStudentClass {
public static void main(String[] args) throws Exception {
//ClassPool为Student类的容器
ClassPool pool = ClassPool.getDefault();
//通过ClassPool生成一个Student.java的新类
CtClass studentClass = pool.makeClass("Student");
//模仿从数据库获取到的字段
List<String> cols = new ArrayList<String>();
cols.add("name");
cols.add("age");
//首先添加类属性private String xxx
for (String column : cols) {
//student类属性
CtField stuField = new CtField(pool.getCtClass("java.lang.String"), column, studentClass);
//设置类修饰,public或private等
stuField.setModifiers(Modifier.PRIVATE);
//添加属性
studentClass.addField(stuField);
//为name和age属性添加getxxx和setxxx方法,column应该使用驼峰命名规则,即单词首字母大写(除第一个外)
// 如getName,setName,这里没有使用,所以生成的是getname,setname
studentClass.addMethod(CtNewMethod.getter("get"+column, stuField));
studentClass.addMethod(CtNewMethod.setter("set"+column, stuField));
}
//使用我们创建的类设置属性值
studentClass.setAttribute("name", "张三".getBytes());
byte[] nameByte = studentClass.getAttribute("name");
//设置student类的年龄
studentClass.setAttribute("age", "30".getBytes());
byte[] ageByte = studentClass.getAttribute("age");
//输出设置的值
System.out.println("名字:"+new String(nameByte)+"===年龄:"+new String(ageByte));
//把内存中的对象生成class文件并,也可以不写,注意:不能在输出之后使用studentClass对象,因为内存中已经没有了。
byte[] bytArr = studentClass.toBytecode();
FileOutputStream fos = new FileOutputStream(new File("D://Student.class"));
fos.write(bytArr);
fos.close();
}
}