博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类型判断时instanceof和equals的不同用法
阅读量:6607 次
发布时间:2019-06-24

本文共 4466 字,大约阅读时间需要 14 分钟。

hot3.png

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

先贴出两段方法:

// Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map	public static Map
transBean2Map(Object obj) { if(obj == null){ return null; } Map
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
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())

转载于:https://my.oschina.net/u/1760932/blog/2987018

你可能感兴趣的文章
力扣算法题—085最大矩阵
查看>>
svs 在创建的时候 上传文件夹 bin obj 这些不要提交
查看>>
mysql-用命令导出、导入表结构或数据
查看>>
Tinkphp
查看>>
EntityFrameworkCore 一对一 && 一对多 && 多对多配置
查看>>
How to temporally disable IDE tools (load manually)
查看>>
Vue.js学习 Item4 -- 数据双向绑定
查看>>
几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)
查看>>
server application unavailable
查看>>
eclipse 的小技巧
查看>>
频率域滤波
查看>>
图片存储类型的种类、特点、区别
查看>>
GETTING UP AND RUNNING WITH NODE.JS, EXPRESS, JADE, AND MONGODB
查看>>
求二叉树第K层节点的个数
查看>>
MySQLs数据库建外键时自动跑到缩影处,真奇怪
查看>>
static关键字
查看>>
js 合并多个对象 Object.assign
查看>>
Java 反射机制
查看>>
Unity 碰撞检测中碰撞器与触发器的区别
查看>>
Elasticsearch配置文件说明
查看>>