前言
今天来简单说说java的元编程与元数据。 为什么想要说这样一个话题,目前其实在java的框架中就会大量应用到元编程、而在我的工作之中会大量使用到元数据进行应用开发。下面先所说的内容只包含我在工作实践、应用的方面理解,而不是整个名词的完整介绍,需要看详细的介绍可以点击 wiki:元编程 和 wiki:元数据查看详细的介绍。
元数据
在我的开发工作中,元数据主要是做数据类型约束、接口定义,方法签名定义的作用。 大概的开发流程就是:
- 定义元数据,比如定义一个实体,描述这个实体的属性字段名称,类型,长度等信息。根据这些信息构造成一个规范的xml文件。
- 根据上一步构造的xml文件,也就是这里所指的元数据。(使用一些魔法,雾)使用公司定制化开发的eclipse插件,用这些xml文件生成标准的Java pojo 和 Java interface。然后标准和实体已经定义完成就可以进行具体的方法和接口的实现。
所以说在这里,元数据在应用中的开发中的作用就是做数据约束和标准定义。这样的开发模式可以说是非常好的一个思路。
- 标准化了开发流程,对数据本身有了一个明确的约束。有利于后期的开发维护。
- 减少了重复,意义不大的工作,不需要手动对 Java pojo 和 Java interface 的定义。直接使用元数据来生成对应的Java class 即可。
- 由于元数据的规范化,其实在此基础上的扩展能力有了很大的想象力。比如实体的合法校验 支持 jsr 303 (bean validation)规范等等。
元编程
在Java世界的元编程,其实很简单的说就是注解(annotation)的应用。
这里的就有很多样例了,比如大名鼎鼎的lombok和spring里面的各种注解。为什么这里还将lombok和spring的注解做区分呢?因为这里的元编程应用时期不同:
- lombok 应用于编译期,在java编译生成class文件时,会"偷偷改掉"我们的代码模样,生成对应的模板代码(JSR 269: Pluggable Annotation Processing API),想详细了解的同学可以看这篇文章哦 Java开发神器Lombok的使用与原理
- spring等其他注解主要是在运行期(不敢保证所有的都是在运行时的)。在运行时会调用对应的注解处理器处理对应的逻辑。这里的目的主要是减少模板代码,显得代码过于啰嗦、臃肿。
总结
元编程和元数据的理念都有一个共同的特点,就是减少模板代码,使用代码生成代码的思路去降低工作中繁杂、无用或者意义不大的工作任务。这是极其值得推广的思路,尤其在大型工程面前,可以省下的工作量就非常可观,而且代码量会更少,质量还会更好,也是印证了 less is more 的设计哲学。
元编程和元数据里还有很多概念和触及其他系统知识的东西(比如编译原理什么的,emmm),这篇文章就这样简单聊下啦,发现有错也请及时指出。