一、 获取一个类的所有父类
传入一个类,可以获得该类的所有父类。
/**
* 获取一个类的所有父类 (不包含Object)
*
* @param clz
* @return
*/
public static List<Class<?>> getSuperClasses(Class<?> clz) {
List<Class<?>> list = new ArrayList<>();
Class<?> superclass = clz.getSuperclass();
if (superclass == Object.class || superclass == null) {
return list;
}
list.add(superclass);
list.addAll(getSuperClasses(superclass));
return list;
}
二、 获取 指定类型的所有实现的接口
传入一个类,可以获得该类的所有接口。
/**
* 获取 指定类型的所有实现的接口
*
* @param clz
* @return
*/
public static List<Class<?>> getInterfaces(Class<?> clz) {
List<Class<?>> list = new ArrayList<>();
// 获取 当前clz 实现的所有 接口
Class<?>[] interfaces = clz.getInterfaces();
// 如果 获取不到接口,说明该类没有实现任何接口,直接返回 list
if (interfaces == null) return list;
for (Class aClass : interfaces) {
list.add(aClass);
list.addAll(getInterfaces(aClass));
}
// 获取 clz 的所有父类
List<Class<?>> superClasses = getSuperClasses(clz);
for (Class<?> aClass : superClasses) {
list.addAll(getInterfaces(aClass));
}
// 去重
Set<Class<?>> classes = new HashSet<>(list);
return List.copyOf(classes);
}
三、 获取 某一个类 所有属性
传入一个类,获得该类的所有属性。
/**
* 获取 某一个类 所有属性
*
* @param clz
* @return
*/
public static List<Field> getFields(Class<?> clz) {
List<Field> list = new ArrayList<>();
Field[] declaredFields = clz.getDeclaredFields();
if (declaredFields != null) {
// 加入到 list 中
for (Field f : declaredFields) {
list.add(f);
}
}
// 获取所有父类
List<Class<?>> superClasses = getSuperClasses(clz);
for (Class superclass : superClasses) {
List<Field> fields = getFields(superclass);
list.addAll(fields);
}
return list;
}
四、 获取某个属性的 get方法
/**
* 获取某个属性的 get方法
*
* @param field
* @param clz
* @return
* @throws Exception
*/
public static Method findGetMethodByFieldName(String field, Class<?> clz) throws Exception {
// 根据 field 的名字找到 对应的 Field
Field f = clz.getDeclaredField(field);
// 获取 f 的 类型
Class<?> type = f.getType();
String prefix = "get";
if (type == boolean.class) {
prefix = "is";
}
String methodName = "";
// 验证 field 前两个字母是否是大写的
if (!Pattern.matches("[A-Z]{2,}\\w*", field)) {
//将 field的首字母变大写
field = String.valueOf(field.charAt(0)).toUpperCase() + field.substring(1);
}
methodName = prefix + field;
return clz.getDeclaredMethod(methodName);
}
五、 获取某个属性的 set方法
/**
* 获取某个属性的 set方法
*
* @param field
* @param clz
* @return
* @throws Exception
*/
public static Method findSetMethodByFieldName(String field, Class<?> clz) throws Exception {
// 根据 field 的名字找到 对应的 Field
Field f = clz.getDeclaredField(field);
String methodName = "";
// 验证 field 前两个字母是否是大写的
if (!Pattern.matches("[A-Z]{2,}\\w*", field)) {
//将 field的首字母变大写
field = String.valueOf(field.charAt(0)).toUpperCase() + field.substring(1);
}
methodName = "set" + field;
// 获取 f的类型
return clz.getDeclaredMethod(methodName, f.getType());
}