需求:业务上需要备份数据,记录字段差异,如果字段是对象的话,就不记录。
思路:判断字段是基本类型,则执行业务代码。
/**
* 判断object是否为基本类型
* @param object
* @return
*/
public static boolean isBaseType(Object object) {
Class className = object.getClass();
if (className.equals(java.lang.Integer.class) ||
className.equals(java.lang.Byte.class) ||
className.equals(java.lang.Long.class) ||
className.equals(java.lang.Double.class) ||
className.equals(java.lang.Float.class) ||
className.equals(java.lang.Character.class) ||
className.equals(java.lang.Short.class) ||
className.equals(java.lang.Boolean.class)) {
return true;
}
return false;
}
或者用instanceof,mybatis源码就是用的这个。 推荐用instanceof,因为不会有空指针。
public boolean check(Object o){
return o instanceof Integer;
}
注意:基本类型经过Object一转,就会成包装类。
例如:
int i = 0;
Object o = i;
System.out.println(o.getClass());//输出Integer,而不是int
而且,只有对象才能用instanceof,基本类型用不了instanceof
int i = 0;
boolean b = i instanceof int;//编译报错
boolean b2 = i instanceof Integer;//编译报错
Integer j = 0;
boolean c = j instanceof Integer;//正确
总结:在业务中,判断类型时我不需要管他是int还是Integer,我只需关心这个变量是不是一个值(他是能直接拿到(例如整数,小数,字符串),还是无法直接拿到(自定义的对象,拿到的是一个地址))。
/**
* 判断是否为基本类型的默认值
* @param object
* @return
*/
public static boolean isBaseDefaultValue(Object object) {
Class className = object.getClass();
String strClassName = "" + className;
if(className.equals(java.lang.Integer.class)) {
return (int)object == 0;
} else if(className.equals(java.lang.Byte.class)) {
return (byte)object == 0;
} else if(className.equals(java.lang.Long.class)) {
return (long)object == 0L;
} else if(className.equals(java.lang.Double.class)) {
return (double)object == 0.0d;
} else if(className.equals(java.lang.Float.class)) {
return (float)object == 0.0f;
} else if(className.equals(java.lang.Character.class)) {
return (char)object == '\u0000';
} else if(className.equals(java.lang.Short.class)) {
return (short)object == 0;
} else if(className.equals(java.lang.Boolean.class)) {
return (boolean)object == false;
}
return false;
}
Java判断变量是否是基本类型以及是否是默认值
参考mybatis的源码,判断类型
Object param = params.get(i);
if (param instanceof Integer) {
int value = ((Integer) param).intValue();
prepStatement.setInt(i + 1, value);
} else if (param instanceof String) {
String s = (String) param;
prepStatement.setString(i + 1, s);
} else if (param instanceof Double) {
double d = ((Double) param).doubleValue();
prepStatement.setDouble(i + 1, d);
} else if (param instanceof Float) {
float f = ((Float) param).floatValue();
prepStatement.setFloat(i + 1, f);
} else if (param instanceof Long) {
long l = ((Long) param).longValue();
prepStatement.setLong(i + 1, l);
} else if (param instanceof Boolean) {
boolean b = ((Boolean) param).booleanValue();
prepStatement.setBoolean(i + 1, b);
} else if (param instanceof Date) {
Date d = (Date) param;
prepStatement.setDate(i + 1, (Date) param);
}
(Class<?>)obj.getClass().getField("TYPE").get(null)
obj.getClass().getDeclaredField("name").getType()
判断一个对象是否是基本类型或基本类型的封装类型