用 Java 生成 Java - CodeModel 介绍

用 Java 生成 Java - CodeModel 介绍

简介: 本文将向读者介绍 Java 代码生成器 CodeModel。文中详细介绍了 CodeModel 如何生成 Java 的变量、类、方法、控制语句等,并通过代码演示 - 使用 CodeModel 实现一个单例生成器,让读者对 CodeModel 有一个全面的认识

  在我们编写代码的时候,常常会有这样的情形:一部分代码是可以根据另一部分代码按照某种特定的模式变化而来的;有时,随着那一部分被依赖的代码发生变化,依赖的代码不得不跟着修改;有时,这样的代码会随着项目的推进,不止一次的出现。很典型的一个例子就是,当需要自己实现数据访问层时,通常每个实体类会对应一个 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)

上面的方法通过 int mods 来定义变量的修饰符,mods 来自 CodeModel 的 JMod 类。JMod 类定义了一些 Java 的修饰符常量,包括 ABSTRACT、FINAL、PRIVATE、PROTECTED、PUBLIC、STATIC、SYNCHRONIZED 等。如果要使用多个修饰符,可以通过“+”来实现;

通过 type 来定义变量的类型;通过 name 来定义变量的名字;通过 init 来定义变量的初始值。


清单 4. 生成 Java 本地变量
				 
 JMethod exampleMethod = dc.method(JMod.PUBLIC, cm.VOID, "exampleMethod"); 
 JBlock exampleMethodBlk = exampleMethod.body(); 
 JVar var = exampleMethodBlk.decl(type, "fieldVar"); 
 JVar var1 = exampleMethodBlk.decl(type, "fieldVar1",JExpr.lit(5)); 

以上代码创建了名为 exampleMethod 的方法,并创建了该方法的方法体 exampleMethodBlk,通过方法体的 decl 方法创建了这个方法的变量 var 和 var1,并给变量 var1 赋了初始值。

代码的运行结果为:

 public void exampleMethod() { 
    int fieldVar; 
    int fieldVar1 = 5; 
 } 

对于 Java 的成员变量,可以通过 JDefinedClass 类的 field 方法来生成。成员变量是 JFieldVar 类型的。JDefinedClass 类提供了四个重载的 field 方法来生成成员变量如下,通过 mods 来定义成员变量的修饰符;通过 type 来定义变量的类型;通过 name 来定义变量的名字;通过 init 来定义变量的初始值。

  • field(int mods, Class<?> type, String name)
  • field(int mods, Class<?> type, String name, JExpression init)
  • field(int mods, JType type, String name)
  • field(int mods, JType type, String name, JExpression init)

清单 5. 生成 Java 成员变量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值