Java反射中java.beans包学习总结

 更新时间:2018年02月22日 10:02:23   作者:若鱼1919   我要评论
本篇文章通过学习Java反射中java.beans包,吧知识点做了总结,并把相关内容做了关联,对此有需要的朋友可以学习参考下。

之前一直以为PropertyEditor是SpringMVC提供的,今天才知道这个是jdk提供的,汗颜啊!

这个东西能干啥用呢?可以把字符串转成一个bean对象,spring mvc在把form表单映射到controller的入参对象就是利用的这个东西。

看一个例子:

NodeDO.java:一个标准的javabean对象

public class NodeDO {
	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=" + DodeDOEditor.sdf.format(date) + "]";
	}
}

TestDO.java一样,里面引用了NodeDO:

public class TestDO { 
  private String nodeName; 
  private NodeDO nodeDO; 
  public String getNodeName() { 
    return nodeName; 
  } 
  public void setNodeName(String nodeName) { 
    this.nodeName = nodeName; 
  } 
  public NodeDO getNodeDO() { 
    return nodeDO; 
  } 
  public void setNodeDO(NodeDO nodeDO) { 
    this.nodeDO = nodeDO; 
  } 
}

我们想实现类似这样的功能:

public static void main(String[] args) throws Exception{ 
    Map<String, String> parameters = new HashMap<String, String>(){ 
      { 
        put("nodeName", "小胖测试"); 
        put("nodeDO", "xiaopang|xiaopang@163.com|2015-10-20 12:00:00"); 
      } 
    };  
    TestDO testDo = convert(parameters); 
    System.out.println(testDo.getNodeName()); 
    System.out.println(testDo.getNodeDO()); 
  }

把parameters这个map转化成TestDO的对象,该如何来做呢?

(1)首先要定义一个用来转化Property的PropertyEditor:

public class DodeDOEditor extends PropertyEditorSupport{ 
  public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  @Override 
  public void setAsText(String text) throws IllegalArgumentException{ 
    String[] tokens = text.split("\\|"); 
    NodeDO nodeDo = new NodeDO(); 
    nodeDo.setName(tokens[0]); 
    nodeDo.setEmail(tokens[1]); 
    try{ 
      nodeDo.setDate(sdf.parse(tokens[2])); 
    }catch(ParseException e){ 
      throw new IllegalArgumentException(e); 
    } 
    setValue(nodeDo); 
  } 
} 

(2)做转化:

public class PropertyEditorSample { 
  static{ 
    PropertyEditorManager.registerEditor(NodeDO.class, DodeDOEditor.class); 
  } 
  public static void main(String[] args) throws Exception{ 
    Map<String, String> parameters = new HashMap<String, String>(){ 
      { 
        put("nodeName", "小胖测试"); 
        put("nodeDO", "xiaopang|xiaopang@163.com|2015-10-20 12:00:00"); 
      } 
    };  
    TestDO testDo = convert(parameters); 
    System.out.println(testDo.getNodeName()); 
    System.out.println(testDo.getNodeDO()); 
  } 
  private static TestDO convert(Map<String, String> parameters)throws Exception { 
    TestDO testDO = new TestDO(); 
    BeanInfo bi = Introspector.getBeanInfo(TestDO.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(testDO, parameters.get(pd.getName())); 
      }else{ 
        PropertyEditor editor = PropertyEditorManager.findEditor(propertyType); 
        if(editor != null){ 
          editor.setAsText(parameters.get(pd.getName())); 
          writeMethod.invoke(testDO, editor.getValue()); 
        }else{ 
          System.out.println("no editor for:"+pd.getName()); 
        } 
      } 
    } 
    return testDO; 
  } 
}

其实关键点就两句话

<pre name="code" class="java">editor.setAsText(parameters.get(pd.getName()));//1 
editor.getValue();//2 
//因此,一般都会在setAsText中去调用setValue()来保存转化以后的值,这样通过getValue()就能获取到了 

以上就是本次整理的全部内容,如果大家还有任何不明白的地方,可以在下方留言讨论,感谢大家对澳门金沙网上娱乐的支持。

相关文章

  • java计算两个日期之前的天数实例(排除节假日和周末)

    java计算两个日期之前的天数实例(排除节假日和周末)

    下面小编就为大家带来一篇java计算两个日期之前的天数实例(排除节假日和周末)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • ibatis结合oracle批量插入三种方法的测评

    ibatis结合oracle批量插入三种方法的测评

    今天小编就为大家分享一篇关于ibatis结合oracle批量插入三种方法的测评,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java去掉文本中多余的空格与空行实例代码

    java去掉文本中多余的空格与空行实例代码

    在最近的一个项目中发现用户提交的数据中多了很多多余的空格与空行,为了不影响使用,只能想办法去掉了,下面这篇文章主要给大家介绍了关于java去掉文本中多余的空格与空行的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • 老生常谈设计模式之动态代理

    老生常谈设计模式之动态代理

    下面小编就为大家带来一篇老生常谈设计模式之动态代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 浅谈JavaAPI 中 <E> 与 <T> 的含义

    浅谈JavaAPI 中 <E> 与 <T> 的含义

    下面小编就为大家带来一篇浅谈JavaAPI 中 <E> 与 <T> 的含义。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • struts2自定义MVC框架

    struts2自定义MVC框架

    这篇文章主要为大家详细介绍了struts2如何自定义MVC框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • java selenium教程环境搭建方法

    java selenium教程环境搭建方法

    本文主要介绍java selenium 环境搭建,这里详细介绍了selenium的安装环境搭建,有兴趣的小伙伴可以参考下
    2016-08-08
  • Eclipse引用XSD实现XML配置文件提示标签的方法

    Eclipse引用XSD实现XML配置文件提示标签的方法

    今天小编就为大家分享一篇关于Eclipse引用XSD实现XML配置文件提示标签的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • kaptcha验证码使用方法详解

    kaptcha验证码使用方法详解

    这篇文章主要为大家详细介绍了kaptcha验证码的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 详解JAVA流程控制语句

    详解JAVA流程控制语句

    这篇文章主要介绍了Java中的流程控制语句,循环等语句是Java编程中流程控制的基础,需要的朋友可以参考下
    2017-04-04

最新评论