I wish to instantiate a java class that I have defined in my domain and I want to use it from my FTL code in this way, but I'm getting an error.
<#assign myClassInstance = "com.domain.MyClass"?new())>
Is it possible? What I should change to do it?
MyClass
doesn't implements the TemplateModel
Thanks!
There's no built-in function for instantiating arbitrary non- TemplateModel
classes... maybe there should be a setting to allow that for ?new
. Anyway, for now you can write a TemplateMethodModelEx
that does that, and then you can pull that into some of your commonly included/imported templates like <#assign unrestrictedNew = "com.example.UnrestrictedNewMethodModel"?new()>
(or just put the instance into the data-model or into the Configuration
as a shared variable) and then you can do <#assign myClassInstance = unrestrictedNew("com.domain.MyClass")(arg1, arg2, argN)>
in your templates. There are two tricky parts in implementing such a TemplateMethodModel
. One is resolving the class name to a Class
, for which I recommend env.getNewBuiltinClassResolver().resolve(className, env, null)
, where env
is the current freemarker.core.Environment
object. The other is calling the constructor, as then you have to convert parameter values and possibly chose an overloaded constructor. For that I recommend calling ow = env.getObjectWrapper()
, see if ow instanceof BeansWrapper
(throw exception if it isn't), then do return ((BeansWrapper) ow).newInstance(cl, arguments)
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.