什么是元编程?
临下班的紧急任务
时钟指向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对象,半个小时不到就收工了,赶紧下班!

还没来得及溜走,又被领导叫住了:“大胖,那个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原创不易,完成人机校验,阅读全文