jfinal 生成实体类

博客内容介绍了如何不依赖Generator在jfinal中手动创建数据库Model和DAO类,作者分享了一个链接供读者参考,但自己的实现已丢失。

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

jfinal根据Generator生成器生成实体类:
package com.ysd.test;
import javax.sql.DataSource;

import com.jfinal.kit.PathKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.generator.Generator;
import com.jfinal.plugin.druid.DruidPlugin;
import com.ysd.entity.ImsChatRoomcashsumLast;

public class _JFinalDemoGenerator {
	public static DataSource getDataSource() {
		//PropKit.use("a_little_config.txt");
		DruidPlugin druidPlugin = new DruidPlugin("jdbc:mysql://47.94.172.202/phpweizan", "temp1", "asdfghjkl");
		druidPlugin.start();
		ActiveRecordPlugin activeRecord = new ActiveRecordPlugin(druidPlugin);
		activeRecord.addMapping("ims_chat_roomcashsum_last", "Id",ImsChatRoomcashsumLast.class);
		//activeRecord.addMapping("Askers", "userId",Askers.class);
		
		return druidPlugin.getDataSource();
	}
	
	public static void main(String[] args) {
		// base model 所使用的包名
		String baseModelPackageName = "com.ysd.entity";
		// base model 文件保存路径
		String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/ysd/entity";
		
		// model 所使用的包名 (MappingKit 默认使用的包名)
		String modelPackageName = "com.ysd.entity";
		// model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)
		String modelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/ysd/entity";
		
		
		// 创建生成器
		//Generator generator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
		//generator.setMetaBuilder(new _MetaBuilder(getDataSource()));
		// 设置是否生成链式 setter 方法
		//generator.setGenerateChainSetter(false);
		// 添加不需要生成的表名
		//generator.addExcludedTable("ims_chat_roomcashsum_last");
		
		// 设置是否在 Model 中生成 dao 对象
		//generator.setGenerateDaoInModel(true);
		// 设置是否生成链式 setter 方法
		//generator.setGen
### Java反射机制动态生成或操作实体类 Java 的反射机制允许开发者在运行时动态地访问和操作类及其成员。虽然反射本身并不直接支持生成新的类,但它可以通过与其他工具(如 Javassist 或 CGLIB)结合使用来实现这一目标。 #### 使用反射操作现有实体类的方法 通过 `java.lang.reflect.Method` 和其他相关 API,可以动态获取并调用类中的方法[^1]。以下是具体示例: ```java import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("com.example.User"); Object instance = clazz.getDeclaredConstructor().newInstance(); Method setNameMethod = clazz.getMethod("setName", String.class); setNameMethod.invoke(instance, "John"); Method getNameMethod = clazz.getMethod("getName"); System.out.println(getNameMethod.invoke(instance)); } } ``` 上述代码展示了如何通过反射创建对象、设置属性以及调用方法。 --- #### 动态生成实体类的方式 如果需要真正动态生成实体类,则需借助第三方库,例如 **Javassist** 或 **CGLIB**。 ##### 使用 Javassist 动态生成实体类 Javassist 是一种强大的字节码操作框架,能够轻松定义新类或将已有类进行修改[^3]。下面是一个简单的例子: ```java import javassist.*; public class DynamicEntityGenerator { public static void main(String[] args) throws Exception { // 创建一个ClassPool实例 ClassPool pool = ClassPool.getDefault(); // 定义一个新的类 CtClass ctClass = pool.makeClass("com.example.DynamicUser"); // 添加字段 CtField idField = new CtField(CtClass.longType, "id", ctClass); ctClass.addField(idField); CtField nameField = new CtField(pool.get("java.lang.String"), "name", ctClass); ctClass.addField(nameField); // 添加getter/setter方法 ctClass.addMethod(CtNewMethod.setter("setId", idField)); ctClass.addMethod(CtNewMethod.getter("getId", idField)); ctClass.addMethod(CtNewMethod.setter("setName", nameField)); ctClass.addMethod(CtNewMethod.getter("getName", nameField)); // 将类加载到JVM中 Class<?> dynamicClass = ctClass.toClass(); Object userInstance = dynamicClass.getDeclaredConstructor().newInstance(); // 测试setter/getter功能 dynamicClass.getMethod("setName", String.class).invoke(userInstance, "Alice"); System.out.println(dynamicClass.getMethod("getName").invoke(userInstance)); } } ``` 此代码片段演示了如何利用 Javassist 来动态构建带有字段及 getter/setter 方法的实体类。 --- ##### 使用 CGLIB 动态代理生成实体类 CGLIB 提供了一种基于继承的方式来扩展已有的类结构[^2]。尽管其主要用途在于 AOP 场景下的代理模式,但在某些情况下也可以用于动态生成子类形式的新实体类。 需要注意的是,由于 CGLIB 基于继承工作原理,在实际应用过程中可能会受到 final 类型限制的影响。 --- #### 结合 EasyPoi 进行动态 Excel 导入导出 EasyPoi 是一款专注于简化 POI 库使用的开源项目,特别适合处理复杂的表格数据场景。当与反射技术相结合时,它可以灵活应对各种自定义需求,比如根据不同的业务逻辑动态调整实体模型。 假设我们希望依据给定列名列表自动映射至对应的数据库表字段类型,则可通过如下方式完成初始化过程[^4]: ```java import org.jeecgframework.poi.excel.annotation.Excel; import javax.persistence.Entity; import java.util.HashMap; import java.util.Map; @Entity @org.jeecgframework.poi.excel.annotation.ExcelTarget("dynamic_entity") public class DynamicEntity { private Map<String, Object> fieldsMap = new HashMap<>(); @Excel(name="通用字段名称") public Object getField(String fieldName){ return this.fieldsMap.get(fieldName); } public void setField(String fieldName,Object value){ this.fieldsMap.put(fieldName,value); } } ``` 以上代码仅作为概念验证展示,并未完全覆盖所有可能情况。实际开发环境中建议进一步优化设计思路以满足特定要求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值