在 Freemarker 中使用动态生成的名称调用函数

Call function with dynamically generated name in Freemarker

我能否从 Java 对象中调用函数,该对象已从几个字符串生成名称?在我的示例中,它是一个简单的 getter。只是好奇。

进程是一个 Java 对象,如下所示:

public class Process {
   private int number = 0;

   public int getNumber() {
       return this.number;
   }

   public String getPropertyName() {
       return "number";
   }
}

假设我们将 Process 对象作为变量 process 传递到 freemarker 模板中,如下所示:

return Results.html().render("process", new Process());

现在我们有一个包含以下代码的 html 页面。我想到的方法应该像这个例子一样做(这个例子不起作用!):

<#assign methodName = "process.get" + process.getPropertyName()?cap_first + "()">
<input name="${process.getPropertyName()}" type="number" value="${methodName}"/>

html中解释的结果是这样的:

<input name="number" type="number" value="process.getNumber()"/>

但它只是一个字符串,不会在 freemarker 模板中解释为存储在方法中的值。

你怎么看,有没有办法实现这个

如果只想动态访问某个字段,那么可以这样写:

<input name="${process.propertyName}" type="number" value="${process[process.propertyName]}"/>

但是如果你真的想调用方法,那么你可以尝试 eval:

<input name="${process.getPropertyName()}" type="number" value="${methodName?eval}"/>