/** * @Description 跟据dto属性动态获取数据 * @Author zhulei * @Date 2022-4-8 11:33 * @Param aclass * @Param fieldNames 要给excel中赋值的name数组,按顺序给值 * @Return */ public static Object[] daochuSelective(Object object,String[] fieldNames){ Object[] objs = new Object[fieldNames.length]; //获取父类及子类所有属性 List<Field> fields = getAllField(object); try { for (int i = 0; i < fieldNames.length; i++) { for (Field f:fields ) { if (f.getName().equals(fieldNames[i])){ String value = doField(object,f); if (null!=value) { objs[i] = value; } else { objs[i] = ""; } } } } }catch (Exception e){ e.printStackTrace(); } return objs; } /** * @Description 获取到对象的所有字段(包括所有继承的父类) * @Author zhulei * @Date 2022-4-8 17:06 * @Param * @Return */ private static List<Field> getAllField(Object model){ Class clazz = model.getClass(); List<Field> fields = new ArrayList<>(); while (clazz!=null){ fields.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()))); clazz = clazz.getSuperclass(); } return fields; } /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ protected static String getFieldValueByFieldName(String fieldName, Object object) { try { Field field = object.getClass().getDeclaredField(fieldName); //设置对象的访问权限,保证对private的属性的访问 field.setAccessible(true); return (String) field.get(object); } catch (Exception e) { e.printStackTrace(); return null; } } /** * @Description 区分不同类型数据 * @Author zhulei * @Date 2022-4-8 14:31 * @Param * @Return */ public static String doField(Object object, Field field) throws Exception{ String value = ""; // String strDateFormat = "yyyy-MM-dd HH:mm:ss"; String strDateFormat = "yyyy-MM-dd"; SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat); // 如果类型是String if (field.getGenericType().toString().equals( "class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名 // 拿到该属性的gettet方法 /** * 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的 * 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX) * 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范 */ Method m = (Method) object.getClass().getMethod( "get" + getMethodName(field.getName())); String val = (String) m.invoke(object);// 调用getter方法获取属性值 if (val != null) { value = val; } } // 如果类型是String if (field.getGenericType().toString().equals( "class java.lang.Long")) { // 如果type是类类型,则前面包含"class ",后面跟类名 Method m = (Method) object.getClass().getMethod( "get" + getMethodName(field.getName())); Long val = (Long) m.invoke(object);// 调用getter方法获取属性值 if (val != null) { value = String.valueOf(val); } } // 如果类型是Integer if (field.getGenericType().toString().equals( "class java.lang.Integer")) { Method m = (Method) object.getClass().getMethod( "get" + getMethodName(field.getName())); Integer val = (Integer) m.invoke(object); if (val != null) { value = String.valueOf(val); } } // 如果类型是Double if (field.getGenericType().toString().equals( "class java.lang.Double")) { Method m = (Method) object.getClass().getMethod( "get" + getMethodName(field.getName())); Double val = (Double) m.invoke(object); if (val != null) { value = String.valueOf(val); } } // 如果类型是Boolean 是封装类 if (field.getGenericType().toString().equals( "class java.lang.Boolean")) { Method m = (Method) object.getClass().getMethod( field.getName()); Boolean val = (Boolean) m.invoke(object); if (val != null) { value = String.valueOf(val); } } // 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的 // 反射找不到getter的具体名 if (field.getGenericType().toString().equals("boolean")) { Method m = (Method) object.getClass().getMethod( field.getName()); Boolean val = (Boolean) m.invoke(object); if (val != null) { value = String.valueOf(val); } } // 如果类型是Date if (field.getGenericType().toString().equals( "class java.util.Date")) { Method m = (Method) object.getClass().getMethod( "get" + getMethodName(field.getName())); Date val = (Date) m.invoke(object); if (val != null) { value = sdf.format(val); } } // 如果类型是Short if (field.getGenericType().toString().equals( "class java.lang.Short")) { Method m = (Method) object.getClass().getMethod( "get" + getMethodName(field.getName())); Short val = (Short) m.invoke(object); if (val != null) { value = String.valueOf(val); } } // 如果还需要其他的类型请自己做扩展 return value; } // 将一个字符串的第一个字母大写 private static String getMethodName(String fildeName) throws Exception{ byte[] items = fildeName.getBytes(); items[0] = (byte) ((char) items[0] - 'a' + 'A'); return new String(items); }
.反射应用
于 2022-04-26 10:00:00 首次发布