com.github.bootfastconfig.springtool.ReflectUtil Maven / Gradle / Ivy
package com.github.bootfastconfig.springtool;
import org.springframework.beans.BeanUtils;
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;
public class ReflectUtil extends ReflectionUtils {
private ReflectUtil() {
}
public static PropertyDescriptor[] getBeanGetters(Class type) {
return getPropertiesHelper(type, true, false);
}
public static PropertyDescriptor[] getBeanSetters(Class type) {
return getPropertiesHelper(type, false, true);
}
public static PropertyDescriptor[] getPropertiesHelper(Class type, boolean read, boolean write) {
try {
PropertyDescriptor[] all = BeanUtils.getPropertyDescriptors(type);
if (read && write) {
return all;
} else {
List properties = new ArrayList(all.length);
PropertyDescriptor[] var5 = all;
int var6 = all.length;
for (int var7 = 0; var7 < var6; ++var7) {
PropertyDescriptor pd = var5[var7];
if (read && pd.getReadMethod() != null) {
properties.add(pd);
} else if (write && pd.getWriteMethod() != null) {
properties.add(pd);
}
}
return (PropertyDescriptor[]) properties.toArray(new PropertyDescriptor[0]);
}
} catch (BeansException var9) {
throw new CodeGenerationException(var9);
}
}
@Nullable
public static Property getProperty(Class> propertyType, String propertyName) {
PropertyDescriptor propertyDescriptor = BeanUtils.getPropertyDescriptor(propertyType, propertyName);
return propertyDescriptor == null ? null : getProperty(propertyType, propertyDescriptor, propertyName);
}
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);
}
@Nullable
public static TypeDescriptor getTypeDescriptor(Class> propertyType, String propertyName) {
Property property = getProperty(propertyType, propertyName);
return property == null ? null : new TypeDescriptor(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);
}
@Nullable
public static Field getField(Class> clazz, String fieldName) {
while (clazz != Object.class) {
try {
return clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException var3) {
clazz = clazz.getSuperclass();
}
}
return null;
}
@Nullable
public static T getAnnotation(Class> clazz, String fieldName, Class annotationClass) {
Field field = getField(clazz, fieldName);
return field == null ? null : field.getAnnotation(annotationClass);
}
}