描述:反射工具类,获取类的构造方法、Get/Set方法、属性、属性值;
import com.maxinhai.world.entity.Music; import java.lang.reflect.*; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; /** * @program: world * @description: 类反射工具类 * @author: XinHai.Ma * @create: 2021-06-30 17:24 */ @SuppressWarnings("all") public class ClassUtils { /** * 利用反射获取类中的所有方法包括父类 * @param object * @return */ public static List<String> getMethods(Object object) { List<String> result = new ArrayList<>(); Class<?> objClass = object.getClass(); // 获取构造方法 Constructor<?>[] constructors = objClass.getConstructors(); for (Constructor<?> constructor : constructors) { String name = constructor.getName(); result.add(name); } // 获取get/set方法 Method[] methods = objClass.getDeclaredMethods(); for (Method method : methods) { String methodName = method.getName(); result.add(methodName); } // 父类 Type superclassType = objClass.getGenericSuperclass(); if("com.maxinhai.world.entity.AutoBaseEntity".equals(superclassType.getTypeName()) || "com.maxinhai.world.entity.AutoBaseEntity".equals(superclassType.getTypeName())) { Class<?> superclass = objClass.getSuperclass(); // 获取get/set方法 Method[] superMethods = superclass.getDeclaredMethods(); for (Method method : superMethods) { String methodName = method.getName(); result.add(methodName); } // 获取构造方法 Constructor<?>[] superConstructors = superclass.getConstructors(); for (Constructor<?> constructor : superConstructors) { String name = constructor.getName(); result.add(name); } } return result; } /** * 利用反射获取对象属性和值,不包含父类 * @param object * @param objClass * @param result * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */ private static void getValues(Object object, Class objClass, Map<String, String> result) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Field[] fields = objClass.getDeclaredFields(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (Field field : fields) { String fieldName = field.getName(); Type type = field.getGenericType(); if("java.lang.String".equals(type.getTypeName())) { Method method = (Method) objClass.getMethod("get" + Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1)); String value = (String) method.invoke(object); if (value != null) { result.put(fieldName, value); } } if("java.lang.Long".equals(type.getTypeName())) { Method method = (Method) objClass.getMethod("get" + Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1)); Long value = (Long) method.invoke(object); if (value != null) { result.put(fieldName, String.valueOf(value)); } } if("java.lang.Integer".equals(type.getTypeName())) { Method method = (Method) objClass.getMethod("get" + Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1)); Integer value = (Integer) method.invoke(object); if (value != null) { result.put(fieldName, String.valueOf(value)); } } if("java.lang.Double".equals(type.getTypeName())) { Method method = (Method) objClass.getMethod("get" + Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1)); Double value = (Double) method.invoke(object); if (value != null) { result.put(fieldName, String.valueOf(value)); } } if("java.time.LocalDateTime".equals(type.getTypeName())) { Method method = (Method) objClass.getMethod("get" + Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1)); LocalDateTime value = (LocalDateTime) method.invoke(object); if (value != null) { result.put(fieldName, formatter.format(value)); } } if("java.util.Date".equals(type.getTypeName())) { Method method = (Method) objClass.getMethod("get" + Character.toUpperCase(fieldName.charAt(0))+fieldName.substring(1)); LocalDateTime value = (LocalDateTime) method.invoke(object); if (value != null) { result.put(fieldName, format.format(value)); } } } } /** * 利用反射获取对象属性和值,包含父类 * @param object * @return * @throws InvocationTargetException * @throws IllegalAccessException * @throws NoSuchMethodException */ public static Map<String, String> getValues(Object object) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { Map<String, String> result = new HashMap<>(); Class<?> objClass = object.getClass(); getValues(object, objClass, result); Type superclassType = objClass.getGenericSuperclass(); if("com.maxinhai.world.entity.AutoBaseEntity".equals(superclassType.getTypeName()) || "com.maxinhai.world.entity.AutoBaseEntity".equals(superclassType.getTypeName())) { Class<?> superclass = objClass.getSuperclass(); Field[] superFields = superclass.getDeclaredFields(); for (Field field : superFields) { getValues(object, superclass, result); } } return result; } /** * 利用反射获取对象所有属性和数据类型 * @param object * @return * @throws InvocationTargetException * @throws IllegalAccessException * @throws NoSuchMethodException */ public static Map<String, String> getAttributes(Object object) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { Map<String, String> result = new HashMap<>(); Class<?> objClass = object.getClass(); Field[] fields = objClass.getDeclaredFields(); for (Field field : fields) { String fieldName = field.getName(); Type type = field.getGenericType(); String typeName = type.getTypeName(); result.put(fieldName, typeName); } Type superclassType = objClass.getGenericSuperclass(); if("com.maxinhai.world.entity.AutoBaseEntity".equals(superclassType.getTypeName()) || "com.maxinhai.world.entity.AutoBaseEntity".equals(superclassType.getTypeName())) { Class<?> superclass = objClass.getSuperclass(); Field[] superFields = superclass.getDeclaredFields(); for (Field field : superFields) { String fieldName = field.getName(); Type type = field.getGenericType(); String typeName = type.getTypeName(); result.put(fieldName, typeName); } } return result; } public static void main(String[] args) throws Exception { Music music = new Music(); // 获取类属性 Map<String, String> attributes = getAttributes(music); attributes.forEach((k,v) -> { System.out.println(k + "=>" + v); }); System.out.println(""); // 获取类属性值 Map<String, String> values = getValues(music); values.forEach((k,v) -> { System.out.println(k + "=>" + v); }); System.out.println(""); // 获取类方法 List<String> methods = getMethods(music); methods.forEach(method -> { System.out.println(method); }); } }