使用javassist生成实体对象

本文介绍了如何利用javassist库动态生成实体对象,以提高数据处理效率。通过在maven项目中引入javassist依赖,然后展示如何在内存中创建Student类的实例,详细讲解了javassist生成实体类对象的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值