Welcome 微信登录

首页 / 软件开发 / JAVA / 用 Java 生成 Java:CodeModel 介绍

用 Java 生成 Java:CodeModel 介绍2013-09-16 IBM 沈 锐, 宋 翔宇在我们编写代码的时候,常常会有这样的情形:一部分代码是可以根据另一部分代码按照某种特定的模式变化而来的; 有时,随着那一部分被依赖的代码发生变化,依赖的代码不得不跟着修改;有时,这样的代码会随着项目的推进,不止一次 的出现。很典型的一个例子就是,当需要自己实现数据访问层时,通常每个实体类会对应一个 DAO(数据访问对象)类,并 且一般来讲 DAO 类的代码编写是很机械的。这时,我们就需要使用“代码生成”来提高我们的开发效率以及提高代码的可 维护性。

Java 有很多种方法可以实现“代码生成”,比如,直接使用打印语句或者使用模板引擎。但相比较而言, 使用 CodeModel 会使代码更灵活也更容易维护。CodeModel 的官网除了 Javadoc 没有提供很好的学习文档,所以我们在项 目中使用时也是不断地摸索。因此,本文既是一篇 CodeModel 的介绍文章,也是我们对 CodeModel 使用的经验总结。本文 将按照一般的学习编程语言的思路并结合示例代码向读者朋友们介绍 CodelModel 的使用方法。希望能对读者朋友们有所帮 助。

CodeModel 简介

CodeModel 是用于生成 Java 代码的 Java 库,它提供了一种通过 Java 程序来生成 Java 程序的方法。

CodeModel 项目是 JAXB 的子项目。JAXB(Java Architecture for XML Binding)是一项可以 根据 XML Schema 产生 Java 类的技术,它提供了将 XML 实例文档反向生成 Java 对象树的方法,并能将 Java 对象树的 内容重新写到 XML 实例文档。JAXB 是 JDK 的组成部分。JAXB RI(Reference Implementation)即 schema compiler 能 够将 XML 的 schema 文件映射为相应的 Java 元素。

CodeModel 的使用方法

如果去阅读 JCodeModel 的 API 文档,JCodeModel 类是我们第一个要去接触的。JCodeModel 类是生成 Java 代码的根。通常我们按照自上而下的顺序 生成所需要的 Java 代码。比如首先创建一个类 JDefinedClass,然后再通过类生成方法、方法体以及方法体内的代码…… 依次而下。

一个 CodeModel 的典型应用如下:

清单 1. CodeModel 的典型应用

JCodeModel cm = new JCodeModel(); // 通过构建 cm 树来生成 Java 代码cm._class(...); ... // 自上而下地生成类、方法等cm.build(new File("."));
在 CodeModel 中除了 JCodeModel 类,几个常用的类有 JDefinedClass、JMethod、 JBlock、JFieldVar、JVar、JType、JExpr 等。

JDefinedClass 类是 CodeModel 来定义类的,它提供了类自身的 创建、继承、实现,以及类成员变量、成员方法的创建方法等

JMethod 类是 Java 的方法类,它可以创建方法体, 那么就有了 JBlock 类

JBlock 类是我们经常要用到的类,它提供了非常多的方法:局部变量的声明、变量赋值、 生成各种控制语句、调用其他方法、设置方法的返回值等

JFieldVar 类用来定义类的成员变量,它可以对成员变量 进行声明、赋值等

JVar 类用来定义变量,提供了变量的基本操作如声明、赋值、初始化等

JType 类用来 定义 Java 中的各种数据类型

JExpr 类表达式的工厂类,它提供了 TRUE 和 FALSE 两个常量值,以及生成表达式 的各种方法以及表达式的赋值等

为了方便后面的代码演示,现在这里构建好 cm 树和 dc 类,CodeModel 会在当前 项目的 src 文件夹 -> dw 包下生成名为 example 的 Java 类。

清单 2. 构建 cm 树和 dc 类

File destDir = new File ((new File("src")); JCodeModel cm = new JCodeModel();// 实例化 CodeModel JDefinedClass dc = cm._class("dw.example"); // 创建 example 类
变量声明与赋值

变量类型

Java 的变量类型包括基本数据类型和引用数据类型。

JCodeModel 类中定义了几个常量来映射 Java 的基本 数据类型。

JCodeModel 的成员常量 BOOLEAN、BYTE、CHAR、SHORT、INT、LONG、FLOAT 和 DOUBLE 涵盖了 Java 所 有的基本数据类型(boolean、byte、char、short、int、long、float、double),以及 NULL、VOID 等。可以通过 cm 直 接得到。

关于引用类型,可以通过 JCodeModel 类的 parseType 方法来得到。在 parseType 方法的参数中指定要 引用的类型,通过类型名来获取对象。

清单 3. 获取引用变量类型

JType type = cm.parseType("String"); JType type1 = cm.parseType("myType");
之后便可以使用 type、type1 来定义变量的类型。

本地变量和 成员变量

Java 的变量可以分为本地变量(也成为局部变量)和成员变量(也成为实例变量)。

对于本地变 量,可以使用 JBlock 类中的 decl 方法对本地变量进行定义和初始化。本地变量是 JVar 类型。JBlock 类提供了三个重 载的 decl 方法,分别是:

decl(int mods, JType type, String name, JExpression init)

decl(JType type, String name)

decl(JType type, String name, JExpression init)