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()就能获取到了 

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

(0)

相关推荐

  • Java使用反射创建对象示例

    本文实例讲述了Java使用反射创建对象.分享给大家供大家参考,具体如下: 一 实战 1 代码 import java.util.*; import java.io.*; public class ObjectPoolFactory { // 定义一个对象池,前面是对象名,后面是实际对象 private Map<String ,Object> objectPool = new HashMap<>(); // 定义一个创建对象的方法, // 该方法只要传入一个字符串类名,程序可以根据该

  • java获取反射机制的3种方法总结

    反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制. 反射机制的应用: 生成动态代理,面向切片编程(在调用方法的前后各加栈帧). 反射机制的原理: 1 首先明确的概念: 一切皆对象----类也是对象. 2 然后知道类中的内容 :modifier constructor field method. 3 其次明白加载: 当Animal.class在硬盘中时

  • Java使用反射调用方法示例

    本文实例讲述了Java使用反射调用方法.分享给大家供大家参考,具体如下: 一 代码 import java.util.*; import java.io.*; import java.lang.reflect.*; public class ExtendedObjectPoolFactory { // 定义一个对象池,前面是对象名,后面是实际对象 private Map<String, Object> objectPool = new HashMap<>(); private Pr

  • Java注解与反射原理说明

    一 点睛 注解若想发挥更大作用,还需借助反射机制之力.通过反射,可以取得一个方法上声明的注解的全部内容. 一般有两种需求: 1 取得方法中全部的注解,通过调用getAnnotations来实现. 2 判断操作是否是指定注解,通过调用getAnnotation来实现. 下面从源码角度来说明怎样获取这些注解信息. 二 源码导读--取得方法中全部的注解 public class AccessibleObject implements AnnotatedElement { ... //取得全部Annot

  • java常用工具类 Reflect反射工具类、String字符串工具类

    本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 Reflect反射工具类 package com.jarvis.base.util; /** * * * @Title: ReflectHelper.java * @Package com.jarvis.base.util * @Description: 反射工具类 * @version V1.0 */ public class ReflectHelper { /** * 提指定的类载入以系统中 * * @param n

  • Java使用反射来获取泛型信息示例

    本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: //获取Field对象f的类型 Class<?> a = f.getType(); 通过这种方式只对普通类型的Field有效.但如果该Field的类型是有泛型限制的类型,如Map<String , Integer>类型,则不能准确的得到该Field的泛型参数. 为了获得指定Field

  • Java利用反射如何查找使用指定注解的类详解

    前言 最近有些空,想自己写个跟spring里的注解一样的注解来用,然后希望能找到使用了自己写了注解的类,下面来介绍一下实现方法 声明,下面代码是没看过spring源码写的,基本上都是网上找的博客,整理的 定义注解 Controller.java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Controller { } RequestMapping.jav

  • java反射耗时测试案例解析

    java反射相对与普通的对象调用原理上来说更加耗时,在调用次数较少的情况下可忽略性能损失,但当调用次数非常多时,需要考虑到此问题,即调用次数过多时不宜使用反射,以下举例: package com.test.reflection; import java.lang.reflect.Method; public class ReflectionDemo { public static void main(String[] args) throws Exception { // 常规方式 Studen

  • 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; pub

  • 深入解析Java中反射中的invoke()方法

    先讲一下java中的反射: 反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作 反射机制应用场景:逆向代码.动态生成类框架等,使用反射机制能够大大的增强程序的扩展性. 反射的基本步骤:首先获得Class对象,然后实例化对象,获得类的属性.方法或者构造函数,最后访问属性.调用方法.调用构造函数创建对象.而invoke()方法就是用来执行指定对象的方法. 在比较复杂的程序或框架中来使用反射技术,可以简化代码提高程序的复用性. 讲的是Method类的invoke()方

  • Java基础之spring5新功能学习

    一.前言 1.整个 Spring5 框架的代码基于 Java8 ,运行时兼容 JDK9,许多不建议使用的类和方 法在代码库中删除 2.Spring 5框架自带了通用的日志封装 Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j2 二.日志配置 jar包 <!-- 日志 --> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <

  • 分享7款开源Java反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码.当然,也有一些商业软件,对其程序进行了混淆加密,这样我们就很难用工具反编译了. 1.Java反编译插件 -- Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到e

  • Java命令行下Jar包打包小结

    jar包打包实现 jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件.第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行.这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件

  • 基于java类路径classpath和包的实例讲解

    类路径(classpath) java编译器编译.java文件和java虚拟机执行.class文件时的路径和写法不一样. 在没有设置任何classpath环境变量的情况下,javac可以编译全路径的.java文件.例如: javac d:\myjava\HelloWorld.java 编译后,在.java同路径目录下生成class文件. 默认java虚拟机要从classpath环境变量的路径中搜索class文件去执行,对于java虚拟机来说,这不是类文件,而是类.它只有类路径,而没有文件系统路径

  • java反编译工具Bytecode-Viewer分享

    在java的开发学习中,可能需要想了解class文件对应的代码内容是什么,如果我们使用IDE工具,可以通过IDE工具的各种反编译插件去进行反编译,但是java的IDE工具还是比较笨重的,启动耗时并且占用内存,这时我们就需要一些简单的反编译小工具去处理. java反编译工具有很多,这里介绍的是Bytecode-Viewer,官网地址bytecodeviewer.com 反编译 通过view菜单可以选择显示面板以及对应的反编译引擎. 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支

  • 最好的Java 反编译工具的使用对比分析

    前言 Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Class 字节码文件的生成有着严格的要求,如果你非常熟悉 Java 虚拟机规范,了解 Class 字节码文件中一些字节的作用,那么理解反编译的原理并不是什么问题. 甚至像下面这样的 Class 文件你都能看懂一二. 一般在逆向研究和代码分析中,反编译用到的比较多.不过在日常开发中,有时候只是简单的看一下所用依赖类的反编译,也是十分重要的. 恰好最近工作中也需要用到 Java 反编译,所以这篇文章介

  • java动态添加外部jar包到classpath的实例详解

    java动态添加外部jar包到classpath的实例详解 前言: 在项目开发过程中我们有时候需要动态的添加外部jar包,但是具体的业务需求还没有遇到过,因为如果动态添加外部jar包后,我们就需要修改业务代码,而修改代码就需要重新启动服务,那样好像就没有必要动态添加外部jar包了,怎么样才能不重新启动服务器就可以使用最新的代码我没有找到方法,如果各位知道的话给我点建议,回归主题,实现动态添加外部jar包到classpath的方法如下: String beanClassName = "com.dy

  • 解决java编译错误( 程序包javax.servlet不存在javax.servlet.*)

    解决java编译错误( 程序包javax.servlet不存在javax.servlet.*) 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax.servlet.http 不存在 等错误 由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决"软件包 javax.servlet不存在"错误的方法: 1. 搜索servle

随机推荐