2012-05-05 64 views
3

StringTemplate允许程序员通过getters(一个没有参数的函数)获取数据。使用来自StringTemplate的参数调用Java函数?

我想知道是否有可能使用字符串模板的参数调用Java函数?

+0

不是真的。这将允许“执行代码”和违反分色。但是,属性格式支持 - 例如'format =“1,2,3,4”'可能会被滥用... – 2012-06-13 06:29:40

+1

也可以通过创建地图并将其放入一些值和预期结果中来人为地模拟类似于功能的行为。然后,您可以在模板中使用这样的地图: machinery

回答

0

滥用字典有一个解决方法。这里是一个实现“功能”的例子,用于限制列表中的项目数量(issue on github)。

在你的代码添加词典:

group.defineDictionary("max", new MaxListItemsLimiter());

使用(在本例为数组的第一个项目是最大的项目数):

<max.(["50",myObject.items]):{msg|<msg.something>}>

final class MaxListItemsLimiter extends AbstractMap<String, Object> { 

    @Override 
    public Object get(Object key) { 
     List items = (List) key; 
     if (!items.isEmpty()) { 
      //First item is max. count 
      Integer limit = NumberUtils.toInt(items.get(0).toString(), -1); //use Integer.parseInt 
      if (limit != -1) { 
       return items.subList(1, Math.min(items.size(), limit + 1)); 
      } else { 
       throw new AssertionError("First parameter in max must be number"); 
      } 
     } else { 
      return super.get(key); 
     } 
    } 

    @Override 
    public Set<Map.Entry<String, Object>> entrySet() { 
     return Collections.emptySet(); 
    } 

    @Override 
    public boolean containsKey(Object key) { 
     if (key instanceof List) { 
      return true; 
     } else { 
      throw new AssertionError("You can use max only on Lists."); 
     } 
    } 
}