org.macrocloud.kernel.toolkit.utils.ReflectUtil Maven / Gradle / Ivy
package org.macrocloud.kernel.toolkit.utils;
import org.springframework.beans.BeansException;
import org.springframework.cglib.core.CodeGenerationException;
import org.springframework.core.convert.Property;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.lang.Nullable;
import org.springframework.util.ReflectionUtils;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* 反射工具类.
*
* @author macro
*/
public class ReflectUtil extends ReflectionUtils {
/**
* 获取 Bean 的所有 get方法.
*
* @param type 类
* @return PropertyDescriptor数组
*/
public static PropertyDescriptor[] getBeanGetters(Class type) {
return getPropertiesHelper(type, true, false);
}
/**
* 获取 Bean 的所有 set方法.
*
* @param type 类
* @return PropertyDescriptor数组
*/
public static PropertyDescriptor[] getBeanSetters(Class type) {
return getPropertiesHelper(type, false, true);
}
/**
* 获取 Bean 的所有 PropertyDescriptor.
*
* @param type 类
* @param read 读取方法
* @param write 写方法
* @return PropertyDescriptor数组
*/
public static PropertyDescriptor[] getPropertiesHelper(Class type, boolean read, boolean write) {
try {
PropertyDescriptor[] all = BeanUtil.getPropertyDescriptors(type);
if (read && write) {
return all;
} else {
List properties = new ArrayList<>(all.length);
for (PropertyDescriptor pd : all) {
if (read && pd.getReadMethod() != null) {
properties.add(pd);
} else if (write && pd.getWriteMethod() != null) {
properties.add(pd);
}
}
return properties.toArray(new PropertyDescriptor[0]);
}
} catch (BeansException ex) {
throw new CodeGenerationException(ex);
}
}
/**
* 获取 bean 的属性信息.
*
* @param propertyType 类型
* @param propertyName 属性名
* @return {Property}
*/
@Nullable
public static Property getProperty(Class> propertyType, String propertyName) {
PropertyDescriptor propertyDescriptor = BeanUtil.getPropertyDescriptor(propertyType, propertyName);
if (propertyDescriptor == null) {
return null;
}
return ReflectUtil.getProperty(propertyType, propertyDescriptor, propertyName);
}
/**
* 获取 bean 的属性信息.
*
* @param propertyType 类型
* @param propertyDescriptor PropertyDescriptor
* @param propertyName 属性名
* @return {Property}
*/
public static Property getProperty(Class> propertyType, PropertyDescriptor propertyDescriptor, String propertyName) {
Method readMethod = propertyDescriptor.getReadMethod();
Method writeMethod = propertyDescriptor.getWriteMethod();
return new Property(propertyType, readMethod, writeMethod, propertyName);
}
/**
* 获取 bean 的属性信息.
*
* @param propertyType 类型
* @param propertyName 属性名
* @return {Property}
*/
@Nullable
public static TypeDescriptor getTypeDescriptor(Class> propertyType, String propertyName) {
Property property = ReflectUtil.getProperty(propertyType, propertyName);
if (property == null) {
return null;
}
return new TypeDescriptor(property);
}
/**
* 获取 类属性信息.
*
* @param propertyType 类型
* @param propertyDescriptor PropertyDescriptor
* @param propertyName 属性名
* @return {Property}
*/
public static TypeDescriptor getTypeDescriptor(Class> propertyType, PropertyDescriptor propertyDescriptor, String propertyName) {
Method readMethod = propertyDescriptor.getReadMethod();
Method writeMethod = propertyDescriptor.getWriteMethod();
Property property = new Property(propertyType, readMethod, writeMethod, propertyName);
return new TypeDescriptor(property);
}
/**
* 获取 类属性.
*
* @param clazz 类信息
* @param fieldName 属性名
* @return Field
*/
@Nullable
public static Field getField(Class> clazz, String fieldName) {
while (clazz != Object.class) {
try {
return clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
clazz = clazz.getSuperclass();
}
}
return null;
}
/**
* 获取 所有 field 属性上的注解.
*
* @param 注解泛型
* @param clazz 类
* @param fieldName 属性名
* @param annotationClass 注解
* @return 注解
*/
@Nullable
public static T getAnnotation(Class> clazz, String fieldName, Class annotationClass) {
Field field = ReflectUtil.getField(clazz, fieldName);
if (field == null) {
return null;
}
return field.getAnnotation(annotationClass);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy