首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 EMF 進行建模,第 2 部分:運用 Eclipse JET(Java Emitter Templates)生成代碼

     編輯:Java 相關知識

JET 簡介:類 JSP 的代碼生成引擎

Java Emitter Templates(JET)是 EMF 內建的代碼生成框架,語法與 JSP 幾乎相同,但輸出目標為 Java 類別、設定檔或任意文本文件。核心特性:

  • 模板編譯為 Java 類別,執行效能高
  • 支援表達式 <%= ... %>、腳本片段 <% ... %>、邏輯控制流
  • 可自訂標記分隔符,支援生成 JSP 等同語法文件
  • 提供骨架機制客製化生成類別結構

快速入門:建立第一個 JET 模板

專案配置

  1. 建立 Java 專案 JETExample,源資料夾設為 src
  2. 右鍵專案 → Add JET Nature,自動建立 templates 目錄
  3. 專案屬性 → JET Settings → Source Container 設為 src

模板撰寫:GenDAO.javajet

<%@ jet
  package="com.ibm.pdc.example.jet.gen"
  class="GenDAO"
  imports="java.util.* com.ibm.pdc.example.jet.model.*"
%>
<% GenDBModel genDBModel = (GenDBModel)argument; %>
package <%= genDBModel.getPackageName() %>;

public class <%= genDBModel.getClassName() %>DAO {
    // 生成的 DAO 類別內容...
}

關鍵指令:jet 指令定義生成的模板類別元數據(套件、類名、匯入),而非輸出內容。

隱含變數

  • stringBuffer (StringBuffer):累積輸出內容
  • argument (Object):呼叫端傳入的參數物件,通常於開頭轉型

編譯與測試

右鍵模板檔 → Compile Template,將於指定套件生成 GenDAO.java,包含 generate(Object argument) 方法。執行該方法即可獲得渲染後的代碼字串。

進階功能

Include 機制重用公共片段

<%@ include file="copyright.inc" %>

將版權聲明等通用內容置於 .inc 檔,編譯時內聯至模板。副檔名避免使用 .jet 防止被誤編譯。

客製化骨架

預設骨架僅包含 generate() 方法。建立 custom.skeleton:

public class CLASS {
    private java.util.Date getDate() {
        return new java.util.Date();
    }
    public String generate(Object argument) {
        return "";
    }
}

於模板 jet 指令加入 skeleton="custom.skeleton"。可用於:

  • 注入共用輔助方法
  • 變更繼承體系(如 extends MyGenerator)
  • 修改 generate() 簽名與回傳型別

注意:JET 實際替換的是骨架中最後一個方法的主體,編輯骨架時務必保留此結構。

執行時編譯與部署策略

JETEmitter 運行時編譯

String base = Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();
String uri = base + "templates/GenTestCase.javajet";
MyJETEmitter jetEmitter = new MyJETEmitter(uri);
jetEmitter.addClasspathVariable("JET_EXAMPLE", PLUGIN_ID);
String generated = jetEmitter.generate(new NullProgressMonitor(), new Object[]{genClass});

關鍵點:標準 JETEmitter 假設運行於插件環境,需繼承並覆寫 initialize() 注入類別路徑,解決生成代碼編譯時的依賴解析問題。

命令列與 Ant 整合

  • 命令列:使用 plugins/org.eclipse.emf.codegen_1.1.0/test 提供的無頭模式腳本
  • Ant 任務:jetc 任務支援 template 或 fileset 屬性,配置 classpath 後即可批量編譯

生成 JSP:修改標記分隔符

<%@ jet
  package="com.ibm.pdc.example.jet.gen"
  class="JspGen"
  imports="java.util.*"
  startTag="[%"
  endTag="%]"
%>
[% String argValue = (String)argument; %]
package [%= argValue %];

將分隔符改為 [% ... %] 避免與 JSP 原生 <% ... %> 衝突,表達式語法相應為 [%= ... %]。

結語

JET 將 JSP 的模板範式引入代碼生成領域,提供預編譯與運行時編譯雙重模式,骨架機制賦予高度客製化彈性。下一篇將介紹 JMerge 如何實現生成代碼與手動修改的共存,構建完整的模型驅動開發流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved