我希望实例化一个我在域中定义的java类,我希望以这种方式从我的FTL代码中使用它,但是我收到了错误。
<#assign myClassInstance = "com.domain.MyClass"?new())>
有可能吗?我应该改变做什么?
MyClass
未实现TemplateModel
谢谢!
答案 0 :(得分: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)
(如果不是则抛出异常),然后执行{{1}}。