package com.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
public class ReflectUtils {
private static ConcurrentHashMap<Class<?>, List<Field>> fieldCache = new ConcurrentHashMap<>();
private static ConcurrentHashMap<Class<?>, List<Method>> methodCache = new ConcurrentHashMap<>();
public static List<Field> getFields(Class<?> clazz) {
List<Field> fields = fieldCache.get(clazz);
if (fields == null) {
fields = new ArrayList<>();
Class<?> superClass = clazz;
while (superClass != Object.class) {
List<Field> superFields = Arrays.stream(superClass.getDeclaredFields()).filter(o -> !o.toString().contains(" static "))
.collect(Collectors.toList());
fields.addAll(superFields);
superClass = superClass.getSuperclass();
}
fieldCache.put(clazz, fields);
}
return fields;
}
public static Object getFieldValue(Object o, String fieldName) throws Exception {
List<Field> fields = getFields(o.getClass());
Field field = fields.stream().filter(f -> f.getName().equalsIgnoreCase(fieldName)).findFirst().orElse(null);
if (field != null) {
field.setAccessible(true);
return field.get(o);
}
return null;
}
public static void setFieldValue(Object o, String fieldName, Object fieldValue) throws Exception {
List<Field> fields = getFields(o.getClass());
Field field = fields.stream().filter(f -> f.getName().equalsIgnoreCase(fieldName)).findFirst().orElse(null);
if (field != null) {
field.setAccessible(true);
field.set(o, fieldValue);
}
}
public static List<Method> getMethods(Class<?> clazz) {
List<Method> methods = methodCache.get(clazz);
if (methods == null) {
methods = new ArrayList<>();
Class<?> superClass = clazz;
while (superClass != Object.class) {
methods.addAll(CollectionUtils.asList(superClass.getDeclaredMethods()));
superClass = superClass.getSuperclass();
}
methodCache.put(clazz, methods);
}
return methods;
}
public static Method getMethod(Object o, String methodName) {
List<Method> methods = getMethods(o.getClass());
return methods.stream().filter(method -> method.getName().equals(methodName)).findFirst().orElse(null);
}
}
java获取对象的属性字段和方法
最新推荐文章于 2023-06-03 19:15:01 发布