最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

使用javassist生成实体对象

Javaweb Anson 浏览 评论

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


来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/javaweb/2017/0703/128.html

    与本文相关的文章

    发表我的评论
    取消评论

    表情

    您的回复是我们的动力!

    • 昵称 (必填)

    网友最新评论