2012-05-05 25 views
3

StringTemplateを使用すると、プログラマーはゲッター(引数なしの関数)を介してデータをフェッチできます。StringTemplateの引数を使用してJava関数を呼び出しますか?

文字列テンプレートの引数を使用してJava関数を呼び出すことは可能ですか?

+0

ありません。そうすれば、「コードの実行」や違反の違反が許されます。ただし、属性フォーマットのサポート - たとえば'' format = "1,2,3,4" 'は悪用される可能性があります... –

+1

マップを作成し、それにいくつかの値と期待される結果を入れることによって、人工的に関数的な動作をシミュレートすることも可能です。次に、テンプレート内の関数のようなマップを使用することができます: machinery

答えて

0

辞書を悪用することで回避策があります。 List(issue on github)の項目数を制限するための "function"の実装例です。あなたのコードで

は、辞書を追加:

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."); 
     } 
    } 
} 
関連する問題