使用JET自动生成代码

EclipseEMF里提供了一个根据模板生成代码的机制:JETEMF就是使用JET来生成代码的。JET可以根据定制的生成模板生成最终的文本(代码)。这一节大致讲一下怎么使用JET来生成代码。 

一、原理

JET的原理很简单:通过一个定义的模板,生成一个中间类,这个中间类有一个generate()方法,用来生成最终的一串字符串(也就是你想生成的代码)。generate()方法里就是使用一个StringBuffer对象,根据模板的内容来构造出一个字符串,最后返回在。 

所以我们生要明白,总共有两个东西在起作用:模板和中间类。

其实还有一个,就是用来生成中间类和执行类的后台引擎。不过从用户的角度来看,通常只能知道模板的存在。 

二、模板格式

首先介绍一下模板的格式。 

要把一个文件作为JET的模板文件,则它的文件名的后缀需要以"jet"结尾,例如:test.javajethelloWorld.xmljet等。这里后缀的前半段可以随意,不过通常用来表示生成的内容格式,例如你要生成的是java代码,则通常是*.javajet;如果想生成xml文件内容,则格式通常是*.xmljet 

要使用jet,首先我们就得先准备一个这样的模板。

上面讲了模板文件名字的约束,下面来讲一下模板文件的内容格式。 

1       文件头    

Jet文件头需要如下声明:

Xml代码   收藏代码
  1. <%@ jet package="包名"  
  2.         imports="导入列表、以空格分开"  
  3.         class="类名"  
  4. %>  

其中必须以<%@ jet开头,以%>结尾。在节一中,我们提到了中间类的概念。这里的packageimportsclass都是针对中间类来说的,class即中间类的类名、package即中间类的包名、imports即中间类的导入。例如:

Xml代码   收藏代码
  1. <%@ jet package="com.tibco.cdc.liugang.jet"  
  2.         imports="java.util.*"  
  3.         class="JETTest"  
  4. %>  

生成的中间类定义如下:

Java代码   收藏代码
  1. package com.tibco.cdc.liugang.jet;  
  2.   
  3. import java.util.*;  
  4.   
  5. public class JETTest  
  6. {  
  7. ……  
  8. }  

2、                  语法格式

从文件头以下,就是具体的模板内容了。具体模板定义成什么样,需要由你最终想要的效果决定,例如:

1、             生成HelloWorld

如果你想生成一个”helloWorld”字符串,那么你就直接在声明头下写:helloWorld。例如(以下用JET文件头声明代表文件头声明): 

 

JET文件头声明

Hello world 

 

则最终生成的结果为:Hello world 

直接给出的文本,在中间类中被直接作为字符串追加到StringBuffer对象中去。例如这里的Hello world

 

Java代码   收藏代码
  1. protected final String TEXT_1 = "Hello world";  
  2. ……  
  3. stringBuffer.append(TEXT_1);  

 

 

2、             参数支持

JET也支持传入参数,例如我们可以定义模板内容如下: 

 

JET文件头声明

Hello world <%=argument%> 

 

则当传入参数为“liugang”时,得到的结果为:Hello world liugang 我们看一下此时中间类的定义:

Java代码  
  1. protected final String TEXT_1 = "Hello world";  
  2. ……  
  3. stringBuffer.append(TEXT_1);  
  4. stringBuffer.append(argument);  

 

 

我们看到参数也被直接追加到StringBuffer对象中去。这里<%=*%>是一个求值表达式,类似于JSP中的语法。使用求值表达式时,表达式被直接追加到stringBuffer对象中去。 JET模板文件中,使用”argument”去得到参数。如果是一个复杂类型的参数,我们需要自己做强制转换或拆解。  

 

3、             代码支持

也可以直接在JET中写一些代码。这里说代码是指这些代码片段在中间类中会被作为一段代码而加入。例如  

 

JET文件头声明

Xml代码   收藏代码
  1. <%if("liugang".equals(argument)){%>  
  2. hello liugang  
  3. <%}else{%>  
  4. hello others  
  5. <%}%>  

 

如果我们传入的参数为 ”liugang” ,则得到结果为: hello liugang ;否则得到: hello others   在中间类中,这一段模板的代码表示为:
Java代码   收藏代码
  1. protected final String TEXT_1 = "hello liugang";  
  2. protected final String TEXT_2 = NL + "hello others";  
  3. ……  
  4. if("liugang".equals(argument)){  
  5.   stringBuffer.append(TEXT_1);  
  6. }else{  
  7.   stringBuffer.append(TEXT_2);  
  8. }  

 

注意:有几个注意事项:

1、  需要注意空格的存在,例如“hello world””  hello world”生成的结果不一样。

2、  构造代码时,需要注意代码定义的完整性,以及代码与非代码片段的区分。 

二、JET引擎 

一般来说,我们都是在程序中使用JET去生成代码,所以当然需要有通过调用程序的方式来生成。这就要用到JET引擎。 EMF中默认提供了JET的引擎类:JETEmitter

我们可以如下例如:

JETEmitter emitter = new JETEmitter(templateURI);

有了这个对象后,就可以直接调用它的方法来生成代码:

emitter.generate(monitor, arguments); 

这里的arguments是一个数组对象,也就是最后会传到模板中的那个argument。最后方法的返回对象是一个String 

有时我们会传入一些只在当前插件中才存在对象,所以需要告知JET引擎这个对象类的所在,我们需要如下使用: 

emitter.addVariable(variableName, pluginID) 

这样,idpluginID的插件就会被作为依赖项加入。当然,可以加入一个或多个。


原链接:http://liugang594.iteye.com/blog/154065

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值