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(); } }