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

我想使用格式创建一个字符串,用格式中的属性替换一些格式的标记。 有没有一个库支持这个或者我将不得不创建我自己的实现?

让我以一个例子来展示。 说我有一个豆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<E> {

  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<Person> bf = new BeanFormatter<Person>(format);
    String s = bf.format(p);
    System.out.println(s);
  }

}

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


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

  • 初始化一个单例Jexl引擎
  • 使用格式化字符串时要使用的所有对象填充MapContext
  • 解析你的字符串并为每个“$ {}”构造创建一个Jexl表达式。
  • 根据对象上下文映射评估先前创建的表达式。
  • Jexl的好处在于它可以让你使用方法调用,而不仅仅是属性。

    希望能帮助到你。

    链接地址: http://www.djcxy.com/p/53727.html

    上一篇: How do I format a string with properties from a bean

    下一篇: what is the difference of the following const defintion