今天看spring1.1.1的源码的时候,看到这个东西,以前从来没见过的啊,后来看了下,
首先这个类是属于java.beans包中的内容,发现以前没怎么注意这个包里面的东西,这个包中都是一定了一些关于bean的操作的类.
发现以前啊,都是使用xml什么的格式来进行bean的定义啊,配置的,
所有就有了这个进行字符串的解析变成bean,再进行调用就方便多了,下面是示例:
实体类:
package com.demo;
import java.util.Date;
public class User {
private String name;
private String email;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "NodeDO [name=" + name + ", email=" + email + ", date=" + UserEditor.sdf.format(date) + "]";
}
}
包含实体类的节点类:
package com.demo;
public class Node {
private String nodeName;
private User user;
public String getNodeName() {
return nodeName;
}
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
package com.demo;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* 编辑器
*/
public class UserEditor extends PropertyEditorSupport {
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 重写从一个字符串String变成bean的方法
*/
@Override
public void setAsText(String text) throws IllegalArgumentException{
String[] tokens = text.split("\\|");
User user = new User();
user.setName(tokens[0]);
user.setEmail(tokens[1]);
try{
user.setDate(sdf.parse(tokens[2]));
}catch(ParseException e){
throw new IllegalArgumentException(e);
}
setValue(user);
}
}
package com.demo;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorManager;
import java.lang.reflect.Method;
import java.util.Map;
/**
* 转换类
*/
public class PropertyEditorSample {
/**
* 进行转换
*/
public static Node convert(Map<String, String> parameters)throws Exception {
//注册bean的编辑器,放到一个WeakHashMap中
PropertyEditorManager.registerEditor(User.class, UserEditor.class);
Node node = new Node();
BeanInfo bi = Introspector.getBeanInfo(Node.class);
//获取所有的属性
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
Class<?> propertyType = pd.getPropertyType();
Method writeMethod = pd.getWriteMethod();
if(propertyType == Class.class){
//ignore
}else if(propertyType == String.class){
writeMethod.invoke(node, parameters.get(pd.getName()));
}else{
//根据类型查找bean的编辑器,获取到了UserEditor的实例
PropertyEditor editor = PropertyEditorManager.findEditor(propertyType);
if(editor != null){
editor.setAsText(parameters.get(pd.getName()));
writeMethod.invoke(node, editor.getValue());
}else{
System.out.println("no editor for:"+pd.getName());
}
}
}
return node;
}
}
测试用例:
import java.util.HashMap;
import java.util.Map;
/**
* @author zk
* @Description: 测试用例
* @date 2018-10-08 15:22
*/
public class Test {
public static void main(String[] args) throws Exception {
Map<String, String> parameters = new HashMap<String, String>(){
{
//这里的key要和Node里面的属性名一致
put("nodeName", "曹操");
put("user", "zhaoJun|changhe@163.com|2018-10-08 15:06:00");
}
};
Node convert = PropertyEditorSample.convert(parameters);
System.out.println(convert.getNodeName());
System.out.println(convert.getUser());
}
}
很简单的东西,只是把一些类里面的属性多封装了几层.
2018年10月8日15:29:48