我希望實例化一個我在我的域中定義的java類,並且我想以這種方式從我的FTL代碼中使用它,但是我出錯。如何在FreeMarker(FTL)中從自己的類創建實例
<#assign myClassInstance = "com.domain.MyClass"?new())>
這可能嗎?我應該改變做什麼?
MyClass
沒有實現TemplateModel
謝謝!
我希望實例化一個我在我的域中定義的java類,並且我想以這種方式從我的FTL代碼中使用它,但是我出錯。如何在FreeMarker(FTL)中從自己的類創建實例
<#assign myClassInstance = "com.domain.MyClass"?new())>
這可能嗎?我應該改變做什麼?
MyClass
沒有實現TemplateModel
謝謝!
沒有內置的函數來實例化任何非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)
。