(Мой другой ответ, вероятно, будет полезен, только если вы уже используете распорки.)
Как и в ответе sdb, есть apache JEXL .
Класс UnifiedJEXL
обеспечивает функциональность, подобную шаблону, поэтому вы можете написать (, как показано в javadocs ):
JexlEngine jexl = new JexlEngine();
UnifiedJEXL ujexl = new UnifiedJEXL(jexl);
UnifiedJEXL.Expression expr = ujexl.parse("Hello ${user}");
String hello = expr.evaluate(context, expr).toString();
(expr
не только выглядит странно, когда передается в качестве параметра самому методу, но на самом деле не требуется в качестве параметра)
Настройка контекста показана ранее на этой же странице:
// Create a context and add data
JexlContext jc = new MapContext();
jc.set("foo", new Foo() );
Вам также понадобится либо регистрация в общем-то, либо вы можете настроить JEXL для использования собственного регистратора.
Чтобы приблизиться к тому, что вы просили, вы можете создать:
public class Formatter {
public static String format(String format, Object ... inputs) {
JexlContext context = new MapContext();
for (int i=0;i<inputs.length;i++) {
context.set("_" + (i+1), inputs[i] );
}
JexlEngine jexl = new JexlEngine();
UnifiedJEXL ujexl = new UnifiedJEXL(jexl);
UnifiedJEXL.Expression expr = ujexl.parse(format);
return expr.evaluate(context).toString();
}
}
и позвоните по номеру
String someString = "Your value is ${_1.myValue}.";
String result = Formatter.format(someString, new MyClass());
В этот момент result
равно "Your value is foo."