java – 如何使用bean中的属性格式化字符串
发布时间:2020-12-15 03:01:40 所属栏目:Java 来源:网络整理
导读:我想使用格式创建一个String,用bean中的属性替换格式的一些标记.是否有支持此功能的库或者我是否必须创建自己的实现? 让我举一个例子来证明.说我有一个豆人; public class Person { private String id; private String name; private String age; //getters
我想使用格式创建一个String,用bean中的属性替换格式的一些标记.是否有支持此功能的库或者我是否必须创建自己的实现?
让我举一个例子来证明.说我有一个豆人; 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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |