惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

博客园 - 刘刚

Google Map [导入]Editor中嵌入Editor [导入]GEF中修改默认的FeedBack [导入](接上篇)关于GEF Feedback的补充 [导入]GEF中导视图的使用 [导入]修改GEF中Connection的端点 [导入]Eclipse中Job API使用总结如下三 [导入]Eclipse中Job API使用总结如下二 [导入]Eclipse中Job API使用总结如下一 [导入]Eclipse调试框架的学习与理解二 [导入]Eclipse调试框架的学习与理解一 [导入]定义自己的Common Navigator三 [导入]定义自己的Common Navigator二 [导入]定义自己的Common Navigator一 [导入]Eclipse运行(launcher)框架三 [导入]Eclipse运行(launcher)框架二 [导入]Eclipse运行(launcher)框架一 [导入]Eclipse属性页的支持 [导入]GEF理解系列九
[导入]使用JET自动生成代码
刘刚 · 2008-01-08 · via 博客园 - 刘刚

网站: JavaEye  作者: liugang594  链接:http://liugang594.javaeye.com/blog/154065  发表时间: 2008年01月08日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

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

一、原理

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

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

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

二、模板格式

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

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

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

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

1       文件头   

Jet文件头需要如下声明:

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

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

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

生成的中间类定义如下:

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
protected final String TEXT_1 = "Hello world";
……
stringBuffer.append(TEXT_1);

2、             参数支持

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

JET文件头声明

Hello world <%=argument%> 

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

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

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

3、             代码支持

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

JET文件头声明

<%if("liugang".equals(argument)){%>
hello liugang
<%}else{%>
hello others
<%}%>
如果我们传入的参数为”liugang”,则得到结果为:hello liugang;否则得到:hello others 在中间类中,这一段模板的代码表示为:
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) 

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


本文的讨论也很精彩,浏览讨论>>

JavaEye推荐

文章来源:http://liugang594.javaeye.com/blog/154065