Eclipse Modeling Framework (EMF) 是模型驅動開發 (MDA) 基石,核心元模型 Ecore 定義模型結構。本文展示如何擴展 Ecore 元模型,將「程式碼實作邏輯」納入模型層,配合動態 JET 模板生成具體、可重用的 Java 方法實作,實現真正的模型驅動程式碼生成。
預設 EMF 僅對 EOperation 生成方法簽名(拋出 `UnsupportedOperationException`),實作邏輯需手工填寫且難以重用。若將「變數宣告、賦值、方法調用、返回」等程式行為建模為模型元素,即可跨專案重用實作邏輯。


核心擴展元素:
EPackageX / EClassX:標記介面,允許編輯器接受子類元素EOperationImpl:核心實體,擴展 EOperation,包含區域變數與語句序列LocalVariable:區域變數(名稱 + Java 類型)Statement 抽象超類及子類:
LiteralAssignment:字面值賦值(如 str = "hello")FieldReferenceAssignment:欄位引用賦值(var1 = var2.name)Invoke:方法調用,可指派結果給變數(myVar = obj.toString())genmodelgenmodel(啟用動態模板)printTimestampMessage(String message)void printTimestampMessage(String message) {
System.out.print(message);
System.out.print("; Timestamp= ");
System.out.println(System.currentTimeMillis());
}
建模要素:
timestampStr (EString)、timestamp (ELong)LiteralAssignment:timestampStr = "; Timestamp = "Invoke(靜態):timestamp = System.currentTimeMillis()Invoke:System.out.print(message)Invoke:System.out.print(timestampStr)Invoke:System.out.println(timestamp)getDayOfWeek(int year, int month, int date)int getDayOfWeek(int year, int month, int date) {
int result;
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, date);
result = calendar.get(Calendar.DAY_OF_WEEK);
return result;
}
建模要素:
result (EInt)、DAY (EInt)、calendar (CalendarType)Return Ref 指向 resultInvoke(靜態):calendar = Calendar.getInstance()Invoke:calendar.set(year, month, date)(參數對應方法參數)FieldReferenceAssignment:DAY = Calendar.DAY_OF_WEEKInvoke:result = calendar.get(DAY)關鍵模板檔:implementedGenOperation.TODO.override.javajetinc。邏輯偽代碼:
If genOperation 非 EOperationImpl → 產生預設拋出異常
Else
宣告所有 LocalVariable 初始化為 null
遍歷 Statements:
依子類型產生 Java 代碼
若有 Return Ref → 產生 return 語句
模板中區分靜態/非靜態調用、處理參數列表、生成變數宣告與賦值語句。

templates 資料夾public void printTimestampMessage(String message) {
// created by implementedGenOperation.TODO.override.javajetinc
// ** EOperationX implementation **
java.lang.String timestampStr = null;
long timestamp;
timestampStr = "; Timestamp = ";
timestamp = java.lang.System.currentTimeMillis();
java.lang.System.out.print(message);
java.lang.System.out.print(timestampStr);
java.lang.System.out.println(timestamp);
}
public int getDayOfWeek(int year, int month, int date) {
// ** EOperationX implementation **
int result;
int DAY;
java.util.Calendar calendar = null;
calendar = java.util.Calendar.getInstance();
calendar.set(year , month , date);
DAY = java.util.Calendar.DAY_OF_WEEK;
result = calendar.get(DAY);
return result;
}
Class.javajet)指定,不可在包含檔中透過擴展 Ecore 將「實作邏輯」模型化,配合動態 JET 模板,EMF 可從單純的資料模型工具進化為完整的程式碼生成平台。雖工具鏈尚有粗糙處,但核心路徑已通,為 MDA 落地提供可行路徑。