如何在FreeMarker(FTL)中从自己的类创建实例

时间:2014-04-06 11:31:32

标签: java freemarker

我希望实例化一个我在域中定义的java类,我希望以这种方式从我的FTL代码中使用它,但是我收到了错误。

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

有可能吗?我应该改变做什么?

MyClass未实现TemplateModel

谢谢!

1 个答案:

答案 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}}。