网络文章

什么是元编程?

临下班的紧急任务时钟指向6点半,张大胖今天不太忙,想着今天终于可以早点儿下班了。收拾好东西准备离开的时候,领导布置了一个新任务,张大胖很无奈,哀叹一声,老老实实地坐下来。新任务看起来非常简单:从一个CSV文件中读取数据,形成Java对象,然后对外提供一个API,让别人调用。这个CSV文件叫做employee.csv,张大胖打开这个CSV文件,里边的内容一看就懂。name,age,levelAndy

临下班的紧急任务

时钟指向6点半,张大胖今天不太忙,想着今天终于可以早点儿下班了。


收拾好东西准备离开的时候,领导布置了一个新任务,张大胖很无奈,哀叹一声,老老实实地坐下来。


新任务看起来非常简单:从一个CSV文件中读取数据,形成Java对象,然后对外提供一个API,让别人调用。


这个CSV文件叫做employee.csv, 张大胖打开这个CSV文件,里边的内容一看就懂。


name,age,level

Andy,25,B7

Joe, 22, B6


张大胖的API就需要返回一个List<Employee>,很自然,Employee类长这个样子:

public class Employee{
    private String name;
    private String age;
    private String level;
    ......
}

class中的每个字段和csv文件的“表头”的“列名”保持一致。


这样简单的任务对张大胖来说是小菜一碟,他写了一个EmployeeParser,专门解析CSV文件,形成Employee对象,半个小时不到就收工了,赶紧下班!


42be70e8333640deaadfb1504861441f.png

还没来得及溜走,又被领导叫住了:“大胖,那个CSV文件新加了一个字段,叫做salary ,快把你的程序改一下啊!”

name,age,level,salary
Andy,25,B7,3000
Joe, 22, B6,2500

张大胖极不情愿地坐下来,给Employee类增加了一个salary的字段,又修改了EmployeeParser类,增加对这个字段的解析。


然后又听到领导在喊:“又加了一个字段,叫做tax !”


没辙,继续修改Employee类和EmployeeParser类吧。 这一次修改完,领导终于放他走了。


模板:用程序来生成程序

等了两趟车,终于在西二旗挤上了13号线,张大胖心里一直在想:明天保不齐还要增加字段,这真是让人厌烦的重复劳动啊。大家都说,Don't repeat yourself, 我这怎么才能减少重复呢?


关键点就在于,那个Java类的字段要和CSV的表头的列名做对应,CSV变化了,Java类的字段以及解析的方法都要做相应得修改才可以。


对了,能不能根据CSV的列名自动地生成那个Employee类啊,这样问题不就解决了吗? CSV变化, Employee类跟着变化,多好!


CSV的“列名”经过读取,可以变成一个Java 的List ,例如["name","age","level"], 如何写一段代码,把这个List变成一个Employee Class呢?


张大胖聚精会神,在地铁上想了一路,完全无视地铁上那拥挤的人群和污浊的空气。


快要下车时,他灵机一动,可以用模板技术嘛,比如velocity模板,定义一个employee.vm :

public class Employee{    
    #foreach ($field in $headers)
        private String $field;         
    #en

原创不易,完成人机校验,阅读全文

相关推荐