package com.opslab.util.bean; import com.opslab.util.collection.CollectionUtil; import com.opslab.util.valid; import java.beans.IntrospectionException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * JavaBean相关的一些操作 */ public final class BeanUtil { private final static Map<String,BeanStruct> simpleProperties(Object obj) { return Factory.BEAN_SIMPLE_PROPERTIES.get(obj.getClass().getName()); } private final static Map<String,BeanStruct> simplePropertiesIgnore(Object obj) { return Factory.BEAN_SIMPLE_PROPERTIESIGNORE.get(obj.getClass().getName()); } private final static Method getReadMethod(Object obj, String pro) { BeanStruct st = simpleProperties(obj).get(pro); return st.getReadMethod(); } private final static Method getWriteMethod(Object obj, String pro) { BeanStruct st = simpleProperties(obj).get(pro); return st.getWriteMethod(); } private final static Method getReadMethodIgnore(Object obj, String pro) { BeanStruct st = simplePropertiesIgnore(obj).get(pro); return st.getReadMethod(); } private final static Method getWriteMethodIgnore(Object obj, String pro) { BeanStruct st = simplePropertiesIgnore(obj).get(pro); return st.getWriteMethod(); } private final static Object readMethod(Object bean, Method readMethod) throws InvocationTargetException, IllegalAccessException { return readMethod.invoke(bean); } private final static void writeMethod(Object bean, Method writeMethod, Object value) throws InvocationTargetException, IllegalAccessException { writeMethod.invoke(bean, value); } /** * 添加Bean到BeanFactory的解析范围中 * * @param obj 将目标obj加入到BeanFactory的解析范围中 */ public final static void add(Object obj) { try { Factory.add(obj); } catch (IntrospectionException | ClassNotFoundException e) { e.printStackTrace(); } } /** * 添加Bean到BeanFactory的解析范围中 * * @param clazz 将目标clazz加入到BeanFactory的解析范围中 */ public final static void add(Class clazz) { try { Factory.add(clazz); } catch (IntrospectionException | ClassNotFoundException e) { e.printStackTrace(); } } /** * 判断属性是否存在 * * @param bean 判断的目标bean * @param pro 判断的属性 * @return 是否存在 */ public final static boolean hasProperty(Object bean, String pro) { add(bean); Map map = simpleProperties(bean); return map.containsKey(pro); } /** * 判断自己定义的而非继承的属性pro是否存在 * * @param bean 判断的目标bean * @param pro 判断的属性 * @return 是否存在 */ public final static boolean hasDeclaredProperty(Object bean, String pro) { add(bean); Map map = simpleProperties(bean); BeanStruct st = (BeanStruct) map.get(pro); return valid.valid(st) && st.isDeclared(); } /** * 判断属性是否存在忽略大小写 * * @param bean 判断的目标bean * @param pro 判断的属性 * @return 是否存在 */ public final static boolean hasPropertyIgnoreCase(Object bean, String pro) { add(bean); Map map = simplePropertiesIgnore(bean); return map.containsKey(pro.toLowerCase()); } /** * 使用自定义的过滤器 * * @param bean 判断的目标bean * @param pro 判断的属性 * @param filter 自定义的属性过滤函数 * @return 是否存在 */ public final static boolean hasPropertyFilter(Object bean, String pro, PropertyFilter filter) { add(bean); pro = filter.Properties(pro); Map<String,BeanStruct> map = simpleProperties(bean); if (valid.valid(map)) { Set<String> set = map.keySet(); for (String s : set) { if (pro.equals(filter.Properties(s))) { return true; } } } return false; } /** * 获取对象的属性 * * @param bean 判断的目标bean * @param pro 判断的属性 * @return 属性对应的值 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static Object getProperty(Object bean, String pro) throws InvocationTargetException, IllegalAccessException { add(bean); return readMethod(bean, getReadMethod(bean, pro)); } /** * 获取对象的属性 * * @param bean 操作的Bean * @param pro 类型属性 * @return 返回属性的值如果发生异常返回空 */ public final static Object getPropertyPeaceful(Object bean, String pro) { add(bean); Object result = null; try { result = readMethod(bean, getReadMethod(bean, pro)); } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } return result; } /** * 获取对象的属性(忽略属性名字大小写) * * @param bean 操作的Bean * @param pro 类型属性 * @return 返回属性的值如果发生异常返回空 */ public final static Object getPropertyIgnoreCase(Object bean, String pro) throws InvocationTargetException, IllegalAccessException { add(bean); return readMethod(bean, getReadMethodIgnore(bean, pro)); } /** * 获取对象的属性(忽略属性名字大小写) * * @param bean 操作的Bean * @param pro 类型属性 * @return 返回属性的值如果发生异常返回空 */ public final static Object getPropertyIgnoreCasePeaceful(Object bean, String pro) { add(bean); Object result = null; try { result = readMethod(bean, getReadMethodIgnore(bean, pro)); } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } return result; } /** * 使用自定义的过滤器获取对象的属性获取对象的属性 * * @param bean 操作的Bean * @param pro 类型属性 * @param filter 自定义的过滤函数 * @return 返回属性的值如果发生异常返回空 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static Object getPropertyFilter(Object bean, String pro, PropertyFilter filter) throws InvocationTargetException, IllegalAccessException { add(bean); Object result = null; pro = filter.Properties(pro); Map<String,BeanStruct> map = simpleProperties(bean); if (valid.valid(map)) { Set<String> set = map.keySet(); for (String s : set) { if (pro.equals(filter.Properties(s))) { result = readMethod(bean, getReadMethod(bean, s)); } } } return result; } /** * 使用自定义的过滤器获取对象的属性 * * @param bean 操作的Bean * @param pro 类型属性 * @param filter 自定义的过滤函数 * @return 返回属性的值如果发生异常返回空 */ public final static Object getPropertyFilterPeaceful(Object bean, String pro, PropertyFilter filter) { add(bean); Object result = null; pro = filter.Properties(pro); Map<String,BeanStruct> map = simpleProperties(bean); if (valid.valid(map)) { Set<String> set = map.keySet(); try { for (String s : set) { if (pro.equals(filter.Properties(s))) { result = readMethod(bean, getReadMethod(bean, s)); } } } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } return result; } /** * 设置对象的属性 * * @param bean 操作的Bean * @param pro 类型属性 * @param value 设置属性的值 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void setProperty(Object bean, String pro, Object value) throws InvocationTargetException, IllegalAccessException { add(bean); writeMethod(bean, getWriteMethod(bean, pro), value); } /** * 设置对象的属性 * * @param bean 操作的Bean * @param pro 类型属性 * @param value 设置属性的值 */ public final static void setPropertyPeaceful(Object bean, String pro, Object value) { add(bean); try { writeMethod(bean, getWriteMethod(bean, pro), value); } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } /** * 设置对象的属性忽略大小写 * * @param bean 操作的Bean * @param pro 类型属性 * @param value 设置属性的值 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void setPropertyIgnoreCase(Object bean, String pro, Object value) throws InvocationTargetException, IllegalAccessException { add(bean); writeMethod(bean, getWriteMethodIgnore(bean, pro), value); } /** * 设置对象的属性忽略大小写 * * @param bean 操作的Bean * @param pro 类型属性 * @param value 设置属性的值 */ public final static void setPropertyIgnoreCasePeaceful(Object bean, String pro, Object value) { add(bean); try { writeMethod(bean, getWriteMethodIgnore(bean, pro), value); } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } /** * 使用自定义的filter进行属性设值 * * @param bean 操作的Bean * @param pro 类型属性 * @param value 设置属性的值 * @param filter 自定义的函数 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void setPropertyFilter(Object bean, String pro, Object value, PropertyFilter filter) throws InvocationTargetException, IllegalAccessException { add(bean); pro = filter.Properties(pro); Map<String,BeanStruct> map = simpleProperties(bean); if (valid.valid(map)) { Set<String> set = map.keySet(); for (String s : set) { if (pro.equals(filter.Properties(s))) { writeMethod(bean, getWriteMethodIgnore(bean, pro), value); } } } } /** * 使用自定义的filter进行属性设值 * * @param bean 操作的Bean * @param pro 类型属性 * @param value 设置属性的值 * @param filter 自定义的函数 */ public final static void setPropertyFilterPeaceful(Object bean, String pro, Object value, PropertyFilter filter) { add(bean); pro = filter.Properties(pro); Map<String,BeanStruct> map = simpleProperties(bean); if (valid.valid(map)) { Set<String> set = map.keySet(); try { for (String s : set) { if (pro.equals(filter.Properties(s))) { writeMethod(bean, getWriteMethodIgnore(bean, pro), value); } } } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } } /** * 拷贝对象指定的属性 * * @param srcBean 源Bean * @param destBean 目标Bean * @param pros copy的属性 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void copyProperty(Object srcBean, Object destBean, String[] pros) throws InvocationTargetException, IllegalAccessException { add(srcBean); add(destBean); if (valid.valid(pros)) { for (String s : pros) { Object value = readMethod(srcBean, getReadMethod(srcBean, s)); writeMethod(destBean, getWriteMethod(destBean, s), value); } } } /** * 拷贝对象指定的属性 * * @param srcBean 源Bean * @param destBean 目标Bean * @param pros copy的属性 */ public final static void copyPropertyPeaceful(Object srcBean, Object destBean, String[] pros) { add(srcBean); add(destBean); if (valid.valid(pros)) { try { for (String s : pros) { Object value =readMethod(srcBean, getReadMethod(srcBean, s)); writeMethod(destBean, getWriteMethod(destBean, s),value ); } } catch (InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } } /** * 复制同名属性 * * @param srcBean 源Bean * @param destBean 目标Bean * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void copyProperties(Object srcBean, Object destBean) throws InvocationTargetException, IllegalAccessException { add(srcBean); add(destBean); Map<String,BeanStruct> srcMap = simpleProperties(srcBean); Map<String,BeanStruct> dstMap = simpleProperties(destBean); Map<String,BeanStruct> intersection = CollectionUtil.intersection(srcMap, dstMap); for (Map.Entry<String,BeanStruct> entry : intersection.entrySet()) { String key = entry.getKey(); Object value = readMethod(srcBean, getReadMethod(srcBean, key)); writeMethod(destBean, getWriteMethod(destBean, key), value); } } /** * 复制同名属性 * * @param srcBean 源Bean * @param destBean 目标Bean */ public final static void copyPropertiesPeaceful(Object srcBean, Object destBean) { add(srcBean); add(destBean); Map<String,BeanStruct> srcMap = simpleProperties(srcBean); Map<String,BeanStruct> dstMap = simpleProperties(destBean); Map<String,BeanStruct> intersection = CollectionUtil.intersection(srcMap, dstMap); for (Map.Entry<String,BeanStruct> entry : intersection.entrySet()) { String key = entry.getKey(); try{ //为什么会将try写在里面而不是foreach的外面? //如果你想尽可能多的复制属性的话你可以 Object value = readMethod(srcBean, getReadMethod(srcBean, key)); writeMethod(destBean, getWriteMethod(destBean, key), value); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } /** * 复制同名属性(忽略大小写) * * @param srcBean 原Bean * @param destBean 目标Bean * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void copyPropertiesIgnoreCase(Object srcBean, Object destBean) throws InvocationTargetException, IllegalAccessException { add(srcBean); add(destBean); Map<String,BeanStruct> srcMap = simplePropertiesIgnore(srcBean); Map<String,BeanStruct> dstMap = simplePropertiesIgnore(destBean); Map<String,BeanStruct> intersection = CollectionUtil.intersection(srcMap, dstMap); for (Map.Entry entry : intersection.entrySet()) { String key = (String) entry.getKey(); Object value = readMethod(srcBean, getReadMethodIgnore(srcBean, key)); writeMethod(destBean, getWriteMethodIgnore(destBean, key), value); } } /** * 复制同名属性(忽略大小写) * * @param srcBean 原Bean * @param destBean 目标Bean */ public final static void copyPropertiesIgnoreCasePeaceful(Object srcBean, Object destBean) { add(srcBean); add(destBean); Map<String,BeanStruct> srcMap = simplePropertiesIgnore(srcBean); Map<String,BeanStruct> dstMap = simplePropertiesIgnore(destBean); Map<String,BeanStruct> intersection = CollectionUtil.intersection(srcMap, dstMap); for (Map.Entry entry : intersection.entrySet()) { String key = (String) entry.getKey(); Object value = null; try { value = readMethod(srcBean, getReadMethodIgnore(srcBean, key)); writeMethod(destBean, getWriteMethodIgnore(destBean, key), value); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } /** * 使用自定义的属性过滤函数 * * @param srcBean 原Bean * @param destBean 目标bean * @param filter 自定义的过滤函数 * @throws InvocationTargetException * @throws IllegalAccessException */ public final static void copyProperties(Object srcBean, Object destBean, PropertyFilter filter) throws InvocationTargetException, IllegalAccessException { add(srcBean); add(destBean); Map<String,BeanStruct> srcMap = simpleProperties(srcBean); Map<String,BeanStruct> dstMap = simpleProperties(destBean); if (valid.valid(srcMap, dstMap)) { Map<String,String> srcMapFilter = new HashMap<>(); Map<String,String> dstMapFilter = new HashMap<>(); for (Map.Entry<String,BeanStruct> entry : srcMap.entrySet()) { srcMapFilter.put(filter.Properties(entry.getKey()), entry.getKey()); } for (Map.Entry<String,BeanStruct> entry : dstMap.entrySet()) { dstMapFilter.put(filter.Properties(entry.getKey()), entry.getKey()); } Map<String,String> intersection = CollectionUtil.intersection(srcMapFilter, dstMapFilter); if (valid.valid(intersection)) { for (Map.Entry<String,String> entry : intersection.entrySet()) { String key = entry.getKey(); String srcKey = srcMapFilter.get(key); String dstKey = dstMapFilter.get(key); Object value = readMethod(srcBean, getReadMethod(srcBean, srcKey)); writeMethod(destBean, getWriteMethod(destBean, dstKey), value); } } } } /** * 使用自定义的属性过滤函数 * * @param srcBean 原Bean * @param destBean 目标bean * @param filter 自定义的过滤函数 */ public final static void copyPropertiesPeaceful(Object srcBean, Object destBean, PropertyFilter filter) { add(srcBean); add(destBean); Map<String,BeanStruct> srcMap = simpleProperties(srcBean); Map<String,BeanStruct> dstMap = simpleProperties(destBean); if (valid.valid(srcMap, dstMap)) { Map<String,String> srcMapFilter = new HashMap<>(); Map<String,String> dstMapFilter = new HashMap<>(); for (Map.Entry<String,BeanStruct> entry : srcMap.entrySet()) { srcMapFilter.put(filter.Properties(entry.getKey()), entry.getKey()); } for (Map.Entry<String,BeanStruct> entry : dstMap.entrySet()) { dstMapFilter.put(filter.Properties(entry.getKey()), entry.getKey()); } Map<String,String> intersection = CollectionUtil.intersection(srcMapFilter, dstMapFilter); if (valid.valid(intersection)) { for (Map.Entry<String,String> entry : intersection.entrySet()) { String key = entry.getKey(); String srcKey = srcMapFilter.get(key); String dstKey = dstMapFilter.get(key); try { Object value = readMethod(srcBean, getReadMethod(srcBean, srcKey)); writeMethod(destBean, getWriteMethod(destBean, dstKey), value); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } }