博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过读取Properties文件,Java动态实例化和 调用set方法于实体
阅读量:4030 次
发布时间:2019-05-24

本文共 2809 字,大约阅读时间需要 9 分钟。

其实,主要是做一点记录!

在项目中,涉及到会计与财务的的内容,在涉及实体时,如资产类,负债类,成本类,损益类,还有权益类,在初期的需求下,

每个实体主要的Field有编号(Id), 科目代码(code), 科目名称(subject)。

由于,需要在数据库中生成相应的数据,一级科目有大量的的子科目,在生成数据库后,可通过数据库添加记录,也可以在程序中

new 出实体并set属性,我觉得这些工作量较大并且全是重复的工作,所以通过读取Properties文件,动态的实例化,并通过JPA持久化实体。

以资产类为例,会计科目有:

1001=库存现金1002=银行存款1015=其他货币资金1121=应收票据 1122=应收账款1123=预付账款1131=应收股利1132=应收利息1231=其他应收款 1241=坏账准备1401=材料采购1402=在途物资1403=原材料1406=库存商品1407=发出商品1412=包装物及低值易耗品1461=存货跌价准备1501=待摊费用1531=长期应收款1601=固定资产1602=累计折旧1603=固定资产减值准备1606=固定资产清理1701=无形资产1702=累计摊销1703=无形资产减值准备1711=商誉1801=长期待摊费用1811=递延所得税资产1901=待处理财产损溢
其他科目略

单元测试代码

public void saveSubject() {		try {			Properties p = new Properties();			Reader reader = new InputStreamReader(this.getClass().getResourceAsStream("group_debts.properties"), "utf-8");			p.load(reader);			//保存负债			save(p,DebtGroup.class.getName());						//保存资产			reader = new InputStreamReader(this.getClass().getResourceAsStream("group_assets.properties"), "utf-8");			p.load(reader);			save(p,AssetsGroup.class.getName());						//保存成本			reader = new InputStreamReader(this.getClass().getResourceAsStream("group_cost.properties"), "utf-8");			p.load(reader);			save(p,CostGroup.class.getName());						//保存权益			reader = new InputStreamReader(this.getClass().getResourceAsStream("group_equity.properties"), "utf-8");			p.load(reader);			save(p,OwnersEquity.class.getName());						//保存损益			reader = new InputStreamReader(this.getClass().getResourceAsStream("group_pl.properties"), "utf-8");			p.load(reader);			save(p,ProfileLossGroup.class.getName());								} catch (Exception e) {			e.printStackTrace();		}	}	//保存实体,通过泛型保存	void save(Properties p, String str) throws Exception {		Set set = p.keySet();		for (Object key : set) {			String k = (String)key;			Class
clazz = Class.forName(str); Object obj = clazz.newInstance(); Field[] fs = clazz.getDeclaredFields(); //获取所有属性 for (Field f : fs) { if (f.getName().equals("serialVersionUID")) { continue; } PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz); //获取属性描述 //获得写方法 Method wM = pd.getWriteMethod(); //System.out.println("M:" + wM.getName()); //获得方法的参数 Class
[] classes = wM.getParameterTypes(); //判断参数不为空,则只有一个 if(classes != null && classes.length == 1){ //因为是标准的set方法,所以只取第一个参数 //判断参数类型 if(classes[0].equals(String.class)){ //调用set方法,传参 if ("setCode".equals(wM.getName())) { wM.invoke(obj, k); } else if ("setSubject".equals(wM.getName())) { wM.invoke(obj, p.getProperty(k)); } } } } dao.save(obj); } }
思路是:通过Class.forName(xxx), 加载类, 并通过newInstance单例方法生成一个类对象,再通过反射调用set写方法,并设置属性的值。

记录于此,聊以安慰。

转载地址:http://zrlbi.baihongyu.com/

你可能感兴趣的文章
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
ArrayList集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>