通过读取Properties文件,Java动态实例化和 调用set方法于实体

14 篇文章 0 订阅

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

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

每个实体主要的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<Object> 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写方法,并设置属性的值。

记录于此,聊以安慰。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值