2014-04-06 71 views
1

我希望實例化一個我在我的域中定義的java類,並且我想以這種方式從我的FTL代碼中使用它,但是我出錯。如何在FreeMarker(FTL)中從自己的類創建實例

<#assign myClassInstance = "com.domain.MyClass"?new())> 

這可能嗎?我應該改變做什麼?

MyClass沒有實現TemplateModel

謝謝!

回答

1

沒有內置的函數來實例化任何非TemplateModel類...也許應該有一個設置,以允許爲?new。無論如何,現在你可以編寫一個TemplateMethodModelEx這樣做,然後你可以將它引入到一些常用的/導入的模板中,比如<#assign unrestrictedNew = "com.example.UnrestrictedNewMethodModel"?new()>(或者將實例放入數據模型或作爲共享變量放入Configuration)然後您可以在模板中執行<#assign myClassInstance = unrestrictedNew("com.domain.MyClass")(arg1, arg2, argN)>。實施這樣的TemplateMethodModel有兩個棘手的部分。一種是將類名解析爲Class,對此我推薦env.getNewBuiltinClassResolver().resolve(className, env, null),其中env是當前的freemarker.core.Environment對象。另一個是調用構造函數,因爲那麼你必須轉換參數值並且可能選擇了一個重載的構造函數。爲此,我建議撥打ow = env.getObjectWrapper(),看看是否ow instanceof BeansWrapper(拋出異常,如果不是),然後做return ((BeansWrapper) ow).newInstance(cl, arguments)