文档章节

类型判断时instanceof和equals的不同用法

wangtx
 wangtx
发布于 2018/12/11 20:45
字数 925
阅读 10
收藏 1

接口设计时为了避免序列化的麻烦,将接口定义为参数为map<String,String>类型的接口,但是现在调用时需要转换当前的实体Bean为Map,接口接收方再把Map转换为另一个Bean实体。过程中的需要对类型判断转换。

先贴出两段方法:

// Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map
	public static Map<String, String> transBean2Map(Object obj) {

		if(obj == null){
			return null;
		}
		Map<String, String> map = new HashMap();
		try {
			BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
			for (PropertyDescriptor property : propertyDescriptors) {
				String key = property.getName();

				// 过滤class属性
				if (!key.equals("class")) {
					// 得到property对应的getter方法
					Method getter = property.getReadMethod();
					Object value = getter.invoke(obj);

					if ((value instanceof String)||(value instanceof Integer)||(value instanceof Long)
							||(value instanceof Short)||(value instanceof Double)||(value instanceof Float)
							||(value instanceof Character)||(value instanceof Byte)||(value instanceof Boolean)){
//						value = sdf.format(value);
						map.put(key, value.toString());
					}else if (value instanceof Date){
						map.put(key, sdf.format(value));
					}
//					map.put(key, value.toString());
				}

			}
		} catch (Exception e) {
			System.out.println("transBean2Map Error " + e);
		}

		return map;

	}

	// Map --> Bean 1: 利用Introspector,PropertyDescriptor实现 Map --> Bean
	public static void transMap2Bean(Map<String, String> map, Object obj) {

		try {
			BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

			for (PropertyDescriptor property : propertyDescriptors) {
				String key = property.getName();

				if (map.containsKey(key)) {
					Object value = map.get(key);
					// 得到property对应的setter方法
					Method setter = property.getWriteMethod();
					if (Date.class.equals(property.getPropertyType())){
						setter.invoke(obj, sdf.parse(value.toString()));
					}else if (Integer.class.equals(property.getPropertyType())||
							Integer.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Integer.parseInt(value.toString()));
					}else if (Long.class.equals(property.getPropertyType())||
							Long.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Long.parseLong(value.toString()));
					}else if (Byte.class.equals(property.getPropertyType())||
							Byte.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Byte.valueOf(value.toString()));
					}else if (Character.class.equals(property.getPropertyType())||
							Character.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, value.toString().charAt(0));
					}else if (Short.class.equals(property.getPropertyType())||
							Short.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Short.parseShort(value.toString()));
					}else if (Boolean.class.equals(property.getPropertyType())||
							Boolean.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Boolean.parseBoolean(value.toString()));
					}else if (Float.class.equals(property.getPropertyType())||
							Float.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Float.parseFloat(value.toString()));
					}else if (Double.class.equals(property.getPropertyType())||
							Double.TYPE.equals(property.getPropertyType())){
						setter.invoke(obj, Double.parseDouble(value.toString()));
					}else if (String.class.equals(property.getPropertyType())){
						setter.invoke(obj, value);
					}
				}

			}

		} catch (Exception e) {
			System.out.println("transMap2Bean Error " + e);
		}

		return;

	}

这里使用了Introspector和PropertyDescriptor的类获取Bean的get和set方法,再通过get和set方法实现对bean的赋值。但是有一个问题就是因为Map中的类型都是String类型,在对Bean取值和赋值时必须要进行类型的转换,否则就会报错。

在类型判断时用到了两种方法,instanceof和equals,下面详细记录一下这种方法的使用:

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。但是有一个问题是,一个实例instanceof任何他的父类都可以返回true,我们在transBean2Map里,因为是从Bean中取到的值都是向上转为Object类型了,所以只是instanceof最终的子类就可以。

在transMap2Bean方法中,因为是把Map中的值放到Bean中,要判断Bean中的属性的类型,并没有实例,只能使用类的equals方法,判断类型是否相同。我使用了Date.class.equals(property.getPropertyType())这种方式。但是还是要注意的地方是,基本数据类型和基本数据类型的对象类型是需要分别判断的。例如:属性为int的property和属性为Integer的property的property.getPropertyType()值是不同的。

总结比较:

instanceof是判断实例是否是指定类的子类或相同类的实例,必须是一个类的实例,Class或者基本数据类型都是不行的。

使用equals时,是判断类是否是相同的,不关乎具体实例。而且基本数据类型和他们的对象类型也是严格区分的。Integer.class.equals(property.getPropertyType())和Integer.TYPE.equals(property.getPropertyType())

© 著作权归作者所有

共有 人打赏支持
wangtx
粉丝 7
博文 32
码字总数 22979
作品 0
济南
程序员
私信 提问
重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法

http://blog.csdn.net/javazejian/article/details/51348320 今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内...

逐梦的Man
2018/08/11
0
0
Java拾遗:001 - 重写 equals 和 hashCode 方法

重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被设计成可覆盖(override)的。但任何一个子类在覆盖这些方法时都应遵守一些通用...

一别丶经年
2018/08/02
0
0
JavaScript instanceof 运算符深入剖析

随着 web 的发展,越来越多的产品功能都放在前端进行实现,增强用户体验。而前端开发的主要语言则是 JavaScript。学好 JavaScript 对开发前端应用已经越来越重要。在开发复杂产品中,需要使用...

IBMdW
2013/06/14
356
1
Java核心技术第五章——2.Object类

Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。但是并不需要这样写: public class Emloyee extends Object 如果没有明确的指出超类,Object就被...

Johnson木木
2018/08/02
0
0
重写equals方法

我们都知道,==是用来比较引用的(物理上的相等),而equals方法是用来比较值的(逻辑上的相等),在许多时候需要重写equals方法来实现我们的需求,比如把对象放到容器中,然后去查找对象。 ...

wf王帆
2016/08/10
20
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部