【问题标题】:How to get class name of String object?如何获取String对象的类名?
【发布时间】:2012-03-15 16:13:48
【问题描述】:

我将一个bean的属性设置为一个String对象,然后当我尝试获取该属性的类名时,抛出以下错误:

预期的哈希值。 plist[0].javaType 在 ibatis/macro.ftl 的第 7 行第 26 列被评估为 freemarker.template.SimpleScalar。

模板代码如下:

<#assign clsName=plist[0].javaType.class.name>

当属性 javaType 设置为 java bean 时,可以正确获取类名。为什么?我需要该属性可以被赋予任何类型,java bean,非 java bean。

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    这里问题的根源在于 FreeMarker 不能直接使用 Java 值/对象。模板语言有自己的简单类型系统,来自外部的东西通过一种称为对象包装的技术映射到该类型系统。 (不是来自外部的值甚至没有内部包装的对象。)您仍然能够获得某个对象的类纯粹是偶然的......发生的事情是对象包装机器决定对象应该映射到“散列”FreeMarker 类型,散列项将对应于对象的 JavaBean 属性。该对象有一个getClass() 方法,它(错误地)被视为“类”属性的getter。

    因此,没有通用的获取课程的方法……尤其是因为有时没有课程可以获取。你可以写一个 TemplateMethodModelEx 来做这件事。

    【讨论】:

    • 你的意思是实现 TemplateMethodModelEx 的 exec 方法,它像 freemarker 函数一样工作?听说fm不能自然地获取所有类名很奇怪,毕竟它是用java编写的,可以与java一起使用,并且有很多java的函数(方法)。
    • 模板语言在 Java 中实现,但不使用 Java 类型/类。就像如果你有一个字符串,你就没有.length()。那是因为您可以将非字符串 Java 对象公开为字符串,并且应该保持透明。无论如何,您仍然可以努力获取类名(查看值是否实现TemplateModelAdapter 等),这对于您的特定应用程序可能已经足够了,但是没有适用于每个使用 FM 的地方的解决方案.因此,模板语言中没有任何内容。
    • 您好 ddekany,您能否给我一个示例,说明如何确定实现 TemplateModelAdapter 的值?谢谢。
    • 正如我之前所说,您应该使用TemplateMethodModelEx 实现此功能。因此,您在 Java 中实现此功能,当然可以使用 instanceof
    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多