package com.awsle.aibatis.reflect; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * * @author 席有芳 * @url http://code.awsle.com/index.php/p/aibatis/ * @mail 951868171@qq.com * @version 1.0 * @since aibatis-Alpha1.0.zip */ public class FieldUtils { public static Method getFieldGetMethod(Class clazz, Field f) { String fn = f.getName(); Method m = getFieldGetMethod(clazz, fn); if(m == null && f.getType() == boolean.class){ m = getBooleanFieldGetMethod(clazz, fn); } return m; } public static Method getBooleanFieldGetMethod(Class clazz, String fieldName) { String mn = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if(isISStart(fieldName)){ mn = fieldName; } try { return clazz.getDeclaredMethod(mn); } catch (NoSuchMethodException e) { e.printStackTrace(); return null; } } public static Method getBooleanFieldSetMethod(Class clazz, Field f) { String fn = f.getName(); String mn = "set" + fn.substring(0, 1).toUpperCase() + fn.substring(1); if(isISStart(f.getName())){ mn = "set" + fn.substring(2, 3).toUpperCase() + fn.substring(3); } try { return clazz.getDeclaredMethod(mn, f.getType()); } catch (NoSuchMethodException e) { e.printStackTrace(); return null; } } private static boolean isISStart(String fieldName){ if(fieldName==null || fieldName.trim().length()==0) return false; //is开头,并且is之后第一个字母是大写 比如 isAdmin return fieldName.startsWith("is") && !Character.isLowerCase(fieldName.charAt(2)); } public static Method getFieldGetMethod(Class clazz, String fieldName) { String mn = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); try { return clazz.getDeclaredMethod(mn); } catch (NoSuchMethodException e) { e.printStackTrace(); return null; } } public static Method getFieldSetMethod(Class clazz, Field f) { String fn = f.getName(); String mn = "set" + fn.substring(0, 1).toUpperCase() + fn.substring(1); try { return clazz.getDeclaredMethod(mn, f.getType()); } catch (NoSuchMethodException e) { if(f.getType() == boolean.class){ return getBooleanFieldSetMethod(clazz, f); } } return null; } public static Method getFieldSetMethod(Class clazz, String fieldName) { try { return getFieldSetMethod(clazz, clazz.getDeclaredField(fieldName)); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return null; } /** * 获取某个字段的值 * @param entity * @param fieldName * @return */ public static Object getFieldValue(Object entity,Field field){ Method method = getFieldGetMethod(entity.getClass(), field); return invoke(entity, method); } /** * 获取某个字段的值 * @param entity * @param fieldName * @return */ public static Object getFieldValue(Object entity,String fieldName){ Method method = getFieldGetMethod(entity.getClass(), fieldName); return invoke(entity, method); } /** * 设置某个字段的值 * @param entity * @param fieldName * @return */ public static void setFieldValue(Object entity,Field field,Object value){ try { Method set = getFieldSetMethod(entity.getClass(), field); if (set != null && value != null) { set.setAccessible(true); Class type = field.getType(); if (type == String.class) { set.invoke(entity, value.toString()); } else if (type == int.class || type == Integer.class) { set.invoke(entity, value == null ? (Integer) null : Integer.parseInt(value.toString())); } else if (type == float.class || type == Float.class) { set.invoke(entity, value == null ? (Float) null: Float.parseFloat(value.toString())); } else if (type == long.class || type == Long.class) { set.invoke(entity, value == null ? (Long) null: Long.parseLong(value.toString())); } else if (type == Date.class) { set.invoke(entity, value == null ? (Date) null: stringToDateTime(value.toString())); } else { set.invoke(entity, value); } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取某个字段的值 * @param entity * @param fieldName * @return */ public static Field getFieldByName(Class clazz,String fieldName){ Field field = null; if(fieldName!=null){ try { field = clazz.getDeclaredField(fieldName); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } return field; } /** * 获取某个实体执行某个方法的结果 * @param obj * @param method * @return */ private static Object invoke(Object obj , Method method){ if(obj == null || method == null) return null; try { return method.invoke(obj); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return null; } public static boolean isBaseDateType(Field field){ Class clazz = field.getType(); return clazz.equals(String.class) || clazz.equals(Integer.class)|| clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.equals(java.util.Date.class) || clazz.equals(java.sql.Date.class) || clazz.isPrimitive(); } private static Date stringToDateTime(String strDate) { if (strDate != null) { try { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strDate); } catch (ParseException e) { e.printStackTrace(); } } return null; } }