您的位置:首页 > 编程语言

使用JET自动生成代码

2015-12-23 09:59 232 查看
在Eclipse的EMF里提供了一个根据模板生成代码的机制:JET。EMF就是使用JET来生成代码的。JET可以根据定制的生成模板生成最终的文本(代码)。这一节大致讲一下怎么使用JET来生成代码。 

一、原理

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

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

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

二、模板格式

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

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

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

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

1、      
文件头   

Jet文件头需要如下声明:

Xml代码  


<%@ jet package="包名"  
        imports="导入列表、以空格分开"  
        class="类名"  
%>  

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

Xml代码  


<%@ jet package="com.tibco.cdc.liugang.jet"  
        imports="java.util.*"  
        class="JETTest"  
%>  

生成的中间类定义如下:

Java代码  


package com.tibco.cdc.liugang.jet;  
  
import java.util.*;  
  
public class JETTest  
{  
……  
}  

2、                 
语法格式

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

1、             生成HelloWorld

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

 

JET文件头声明

Hello world 

 

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

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

 

Java代码  


protected final String TEXT_1 = "Hello world";  
……  
stringBuffer.append(TEXT_1);  

 
 
2、             参数支持

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

 

JET文件头声明

Hello world <%=argument
4000
%> 

 

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

Java代码  

protected final String TEXT_1 = "Hello world";  
……  
stringBuffer.append(TEXT_1);  
stringBuffer.append(argument);  

 
 

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

 

3、             代码支持

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

 

JET文件头声明

Xml代码  


<%if("liugang".equals(argument)){%>  
hello liugang  
<%}else{%>  
hello others  
<%}%>  

 
如果我们传入的参数为”liugang”,则得到结果为:hello liugang;否则得到:hello others 在中间类中,这一段模板的代码表示为:

Java代码  


protected final String TEXT_1 = "hello liugang";  
protected final String TEXT_2 = NL + "hello others";  
……  
if("liugang".equals(argument)){  
  stringBuffer.append(TEXT_1);  
}else{  
  stringBuffer.append(TEXT_2);  
}  

 
注意:有几个注意事项:

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); 

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

原链接:http://liugang594.iteye.com/blog/154065
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: