如何使用bean中的属性格式化字符串

我想使用格式创建一个String,用bean中的属性替换格式的一些标记。 是否有支持此function的库或者我是否必须创建自己的实现?

让我举一个例子来certificate。 说我有一个豆Person ;

 public class Person { private String id; private String name; private String age; //getters and setters } 

我希望能够指定类似的格式字符串;

 "{name} is {age} years old." "Person id {id} is called {name}." 

并使用bean中的值自动填充格式占位符,例如;

 String format = "{name} is {age} old." Person p = new Person(1, "Fred", "32 years"); String formatted = doFormat(format, person); //returns "Fred is 32 years old." 

我看过MessageFormat但这似乎只允许我传递数字索引,而不是bean属性。

滚动我自己,现在测试。 欢迎评论。

 import java.lang.reflect.Field; import java.util.regex.Matcher; import java.util.regex.Pattern; public class BeanFormatter { private Matcher matcher; private static final Pattern pattern = Pattern.compile("\\{(.+?)\\}"); public BeanFormatter(String formatString) { this.matcher = pattern.matcher(formatString); } public String format(E bean) throws Exception { StringBuffer buffer = new StringBuffer(); try { matcher.reset(); while (matcher.find()) { String token = matcher.group(1); String value = getProperty(bean, token); matcher.appendReplacement(buffer, value); } matcher.appendTail(buffer); } catch (Exception ex) { throw new Exception("Error formatting bean " + bean.getClass() + " with format " + matcher.pattern().toString(), ex); } return buffer.toString(); } private String getProperty(E bean, String token) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field field = bean.getClass().getDeclaredField(token); field.setAccessible(true); return String.valueOf(field.get(bean)); } public static void main(String[] args) throws Exception { String format = "{name} is {age} old."; Person p = new Person("Fred", "32 years", 1); BeanFormatter bf = new BeanFormatter(format); String s = bf.format(p); System.out.println(s); } } 

是的,可以使用Pojomatic库。 实现并插入您自己的PojoFormatter实现。 Pojomator#doToString(T)也可能很有趣。

真的不知道你要消耗的模型有多复杂,但如果你想处理对象树,我会用这种方式使用Jexl作为exssion语言来实现我自己的格式化程序:

  1. 初始化单件Jexl引擎
  2. 在格式化字符串时,使用要使用的所有对象填充MapContext
  3. 解析你的字符串,并按照你所拥有的“$ {}”构造创建一个Jexl表达式。
  4. 根据对象上下文映射评估先前创建的表达式。

关于Jexl的好处是它允许你使用方法调用,而不仅仅是属性。

希望能帮助到你。

不太接近,但你可以看看你的bean的StringTemplate:

 public static class User { public int id; // template can directly access via u.id private String name; // template can't access this public User(int id, String name) { this.id = id; this.name = name; } public boolean isManager() { return true; } // u.manager public boolean hasParkingSpot() { return true; } // u.parkingSpot public String getName() { return name; } // u.name public String toString() { return id+":"+name; } // u } 

然后你可以像这样呈现它:

 ST st = new ST("$u.id$: $u.name$", '$', '$'); st.add("u", new User(999, "parrt")); String result = st.render(); // "999: parrt" 

以上代码示例取自ST4简介