其实,主要是做一点记录!
在项目中,涉及到会计与财务的的内容,在涉及实体时,如资产类,负债类,成本类,损益类,还有权益类,在初期的需求下,
每个实体主要的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写方法,并设置属性的值。
记录于此,聊以安慰。