com.github.fosin.cdp.util.ReflectUtil Maven / Gradle / Ivy
package com.github.fosin.cdp.util;
import org.apache.commons.lang3.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by 杨柳 on 2016/8/5 0005.
* email:[email protected]
* tel:18523437817
*
* @author 28860823
* @version $Id: $
*/
public class ReflectUtil {
/**
* 根据属性名获取属性
*
* @param fieldName a {@link java.lang.String} object.
* @param clazz a {@link java.lang.Class} object.
* @return a {@link java.lang.reflect.Field} object.
*/
public static Field getField(String fieldName, Class> clazz) {
Class> old = clazz;
Field field = null;
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(fieldName);
if (field != null) {
break;
}
} catch (Exception e) {
}
}
if (field == null) {
throw new NullPointerException(old + "没有" + fieldName + "属性");
}
return field;
}
/**
* 获取目标类的属性
*
* @param fieldName a {@link java.lang.String} object.
* @param className a {@link java.lang.String} object.
* @return a {@link java.lang.reflect.Field} object.
*/
public static Field getField(String fieldName, String className) {
try {
return getField(fieldName, Class.forName(className));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取目标对象的属性
*
* @param fieldName a {@link java.lang.String} object.
* @param object a {@link java.lang.Object} object.
* @return a {@link java.lang.reflect.Field} object.
*/
public static Field getField(String fieldName, Object object) {
return getField(fieldName, object.getClass());
}
/**
* 获取当前类的属性 包括父类
*
* @param clazz a {@link java.lang.Class} object.
* @param stopClass a {@link java.lang.Class} object.
* @return a {@link java.util.List} object.
*/
public static List getFields(Class> clazz, Class> stopClass) {
try {
List fieldList = new ArrayList<>();
while (clazz != null && clazz != stopClass) {//当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
}
return fieldList;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取当前类的属性 包括父类
*
* @param clazz a {@link java.lang.Class} object.
* @return a {@link java.util.List} object.
*/
@Deprecated
public static List getFields(Class> clazz) {
return getFields(clazz, Object.class);
}
private static List> getSuperClasses(Class> clazz, Class> stopClass) {
List> classes = new ArrayList<>();
while (clazz != null && clazz != stopClass) {//当父类为null的时候说明到达了最上层的父类(Object类).
classes.add(clazz);
clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
}
return classes;
}
/**
* 通过属性赋值
*
* @param fieldName a {@link java.lang.String} object.
* @param object a {@link java.lang.Object} object.
* @param value a {@link java.lang.Object} object.
*/
public static void setValueByField(String fieldName, Object object, Object value) {
Field field = getField(fieldName, object.getClass());
setValueByField(field, object, value);
}
/**
* 通过属性赋值
*
* @param field a {@link java.lang.reflect.Field} object.
* @param object a {@link java.lang.Object} object.
* @param value a {@link java.lang.Object} object.
*/
public static void setValueByField(Field field, Object object, Object value) {
try {
if (!field.isAccessible()) {
field.setAccessible(true);
field.set(object, value);
field.setAccessible(false);
} else {
field.set(object, value);
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取属性的值
*
* @param fieldName a {@link java.lang.String} object.
* @param object a {@link java.lang.Object} object.
* @return a T object.
*/
public static T getValueByField(String fieldName, Object object) {
Field field = getField(fieldName, object.getClass());
return getValueByField(field, object);
}
/**
* 获取属性的值
*
* @param field a {@link java.lang.reflect.Field} object.
* @param object a {@link java.lang.Object} object.
* @return a T object.
*/
public static T getValueByField(Field field, Object object) {
try {
Object value;
if (!field.isAccessible()) {
field.setAccessible(true);
value = field.get(object);
field.setAccessible(false);
} else {
value = field.get(object);
}
return (T) value;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 通过set方法赋值
*
* @param fieldName a {@link java.lang.String} object.
* @param object a {@link java.lang.Object} object.
* @param value a {@link java.lang.Object} object.
*/
public static void setValueBySetMethod(String fieldName, Object object, Object value) {
if (object == null) {
throw new RuntimeException("实例对象不能为空");
}
if (value == null) {
return;
}
try {
String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method setMethod = getMethod(setMethodName, object.getClass(), value.getClass());
setMethod.invoke(object, value);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 通过set方法赋值
*
* @param field a {@link java.lang.reflect.Field} object.
* @param object a {@link java.lang.Object} object.
* @param value a {@link java.lang.Object} object.
*/
public static void setValueBySetMethod(Field field, Object object, Object value) {
if (object == null) {
throw new RuntimeException("实例对象不能为空");
}
if (value == null) {
return;
}
setValueBySetMethod(field.getName(), object, value);
}
/**
* 通过get方法取值
*
* @param fieldName a {@link java.lang.String} object.
* @param object a {@link java.lang.Object} object.
* @return a T object.
*/
public static T getValueByGetMethod(String fieldName, Object object) {
try {
if (StringUtils.isNotBlank(fieldName)) {
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method getMethod = getMethod(getMethodName, object.getClass());
return (T) getMethod.invoke(object);
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 通过get方法取值
*
* @param field a {@link java.lang.reflect.Field} object.
* @param object a {@link java.lang.Object} object.
* @return a T object.
*/
public static T getValueByGetMethod(Field field, Object object) {
return getValueByGetMethod(field.getName(), object);
}
/**
* 获取某个类的某个方法(当前类和父类)
*
* @param methodName a {@link java.lang.String} object.
* @param clazz a {@link java.lang.Class} object.
* @return a {@link java.lang.reflect.Method} object.
*/
public static Method getMethod(String methodName, Class> clazz) {
Method method = null;
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
method = clazz.getDeclaredMethod(methodName);
break;
} catch (Exception e) {
}
}
if (method == null) {
throw new NullPointerException("没有" + methodName + "方法");
}
return method;
}
/**
* 获取get方法
*
* @param fieldName 属性名
* @return 方法名称
*/
public static String getMethodName(String fieldName) {
String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
return methodName;
}
/**
* 获取某个类的某个方法(当前类和父类) 带一个参数
*
* @param methodName a {@link java.lang.String} object.
* @param clazz a {@link java.lang.Class} object.
* @param paramType a {@link java.lang.Class} object.
* @return a {@link java.lang.reflect.Method} object.
*/
public static Method getMethod(String methodName, Class> clazz, Class> paramType) {
Method method = null;
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
method = clazz.getDeclaredMethod(methodName, paramType);
if (method != null) {
return method;
}
} catch (Exception e) {
}
}
if (method == null) {
throw new NullPointerException(clazz + "没有" + methodName + "方法");
}
return method;
}
/**
* 获取某个类的某个方法(当前类和父类)
*
* @param methodName a {@link java.lang.String} object.
* @param obj a {@link java.lang.Object} object.
* @return a {@link java.lang.reflect.Method} object.
*/
public static Method getMethod(String methodName, Object obj) {
return getMethod(methodName, obj.getClass());
}
/**
* 获取某个类的某个方法(当前类和父类) 一个参数
*
* @param methodName a {@link java.lang.String} object.
* @param obj a {@link java.lang.Object} object.
* @param paramType a {@link java.lang.Class} object.
* @return a {@link java.lang.reflect.Method} object.
*/
public static Method getMethod(String methodName, Object obj, Class> paramType) {
return getMethod(methodName, obj.getClass(), paramType);
}
/**
* 获取某个类的某个方法(当前类和父类)
*
* @param methodName a {@link java.lang.String} object.
* @param clazz a {@link java.lang.String} object.
* @return a {@link java.lang.reflect.Method} object.
*/
public static Method getMethod(String methodName, String clazz) {
try {
return getMethod(methodName, Class.forName(clazz));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取某个类的某个方法(当前类和父类) 一个参数
*
* @param methodName a {@link java.lang.String} object.
* @param clazz a {@link java.lang.String} object.
* @param paramType a {@link java.lang.Class} object.
* @return a {@link java.lang.reflect.Method} object.
*/
public static Method getMethod(String methodName, String clazz, Class> paramType) {
try {
return getMethod(methodName, Class.forName(clazz), paramType);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取方法上的注解
*
* @param method a {@link java.lang.reflect.Method} object.
* @param targetAnnotationClass a {@link java.lang.Class} object.
* @return a {@link java.lang.annotation.Annotation} object.
*/
public static Annotation getMethodAnnotation(Method method, Class targetAnnotationClass) {
Annotation methodAnnotation = method.getAnnotation(targetAnnotationClass);
return methodAnnotation;
}
/**
* 获取属性上的注解
*
* @param field a {@link java.lang.reflect.Field} object.
* @param targetAnnotationClass a {@link java.lang.Class} object.
* @return a {@link java.lang.annotation.Annotation} object.
*/
public static Annotation getFieldAnnotation(Field field, Class targetAnnotationClass) {
Annotation methodAnnotation = field.getAnnotation(targetAnnotationClass);
return methodAnnotation;
}
/**
* 获取类上的注解
*
* @param targetAnnotationClass 目标注解
* @param targetObjcetClass 目标类
* @return 目标注解实例
*/
public static Annotation getClassAnnotation(Class targetAnnotationClass, Class> targetObjcetClass) {
Annotation methodAnnotation = targetObjcetClass.getAnnotation(targetAnnotationClass);
return methodAnnotation;
}
/**
* 获取类上的注解
*
* @return 目标注解实例
* @param targetAnnotationClass a {@link java.lang.Class} object.
* @param obj a {@link java.lang.Object} object.
*/
public static Annotation getClassAnnotation(Class targetAnnotationClass, Object obj) {
return getClassAnnotation(targetAnnotationClass, obj.getClass());
}
/**
* 获取类上的注解
*
* @return 目标注解实例
* @param targetAnnotationClass a {@link java.lang.Class} object.
* @param clazz a {@link java.lang.String} object.
*/
public static Annotation getClassAnnotation(Class targetAnnotationClass, String clazz) {
try {
return getClassAnnotation(targetAnnotationClass, Class.forName(clazz));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取注解某个属性的值
*
* @param methodName 属性名
* @param annotation 目标注解
* @param 返回类型
* @throws Exception 异常
* @return a T object.
*/
public static T getAnnotationValue(String methodName, Annotation annotation) {
try {
Method method = annotation.annotationType().getMethod(methodName);
Object object = method.invoke(annotation);
return (T) object;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
/**
* 获取某个类的某个方法上的某个注解的属性
*
* @param methodName 注解属性的名字
* @param targetAnnotationClass 目标注解
* @param targetObjecMethodName 目标类的方法
* @param targetObjectClass 目标类
* @param 返回值类型
* @return a T object.
*/
public static T getMethodAnnotationValue(String methodName, Class targetAnnotationClass, String targetObjecMethodName, Class targetObjectClass) {
Method method = getMethod(targetObjecMethodName, targetObjectClass);
Annotation annotation = getMethodAnnotation(method, targetAnnotationClass);
return getAnnotationValue(methodName, annotation);
}
/**
* getFieldAnnotationValue
*
* @param methodName 注解属性名
* @param targetAnnotationClass 目标注解
* @param targetObjecFieldName 目标属性名字
* @param targetObjectClass 目标类
* @param 返回值类型
* @return a T object.
*/
public static T getFieldAnnotationValue(String methodName, Class targetAnnotationClass, String targetObjecFieldName, Class targetObjectClass) {
Field field = getField(targetObjecFieldName, targetObjectClass);
Annotation annotation = getFieldAnnotation(field, targetAnnotationClass);
return getAnnotationValue(methodName, annotation);
}
/**
* 判断 clazz是否是target的子类型或者相等
*
* @param clazz a {@link java.lang.Class} object.
* @param target a {@link java.lang.Class} object.
* @return a boolean.
*/
public static boolean isSubClassOrEquesClass(Class> clazz, Class> target) {
if (clazz == target) {
return true;
}
while (clazz != Object.class) {
if (clazz == target) {
return true;
}
clazz = clazz.getSuperclass();
}
return false;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy