
com.star.beans.BeanUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of utils Show documentation
Show all versions of utils Show documentation
some utility class for java develop
The newest version!
package com.star.beans;
import com.star.clazz.ClassUtil;
import com.star.collection.array.ArrayUtil;
import com.star.collection.map.MapUtil;
import com.star.exception.ToolException;
import com.star.reflect.MethodUtil;
import com.star.string.StringUtil;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
/**
* bean工具类
*
* @author starhq
*/
public final class BeanUtil {
/**
* 缓存
*/
private static final ClassValue CACHE = new ClassValue() {
/**
* 获得bean的PropertyDescriptor
*
* @param type 当前类
* @return PropertyDescriptor数组
*/
@Override
protected PropertyDescriptor[] computeValue(final Class> type) {
try {
return Introspector.getBeanInfo(type).getPropertyDescriptors();
} catch (IntrospectionException e) {
throw new ToolException(
StringUtil.format("get clazz {}'s PropertyDescriptor array failue,the reasone is: {}",
ClassUtil.getClassName(type, false), e.getMessage()),
e);
}
}
};
/**
* class常量
*/
private static final String CLASS = "class";
private BeanUtil() {
}
/**
* 获得bean的PropertyDescriptor
*
* @param clazz 当前类
* @return PropertyDescriptor数组
*/
public static PropertyDescriptor[] getPropertyDescriptors(final Class> clazz) {
return CACHE.get(clazz);
}
/**
* 获取对象的简单属性
*
* @param instance 实例
* @param name 属性名
* @param 范型
* @return 对应属性的值
*/
public static Object getSimpleProperty(final T instance, final String name) {
final PropertyDescriptor descriptor = getDescriptor(instance.getClass(), name);
final Method method = descriptor.getReadMethod();
return MethodUtil.invoke(instance, method);
}
/**
* 为对象设置简单属性
*
* @param instance 实例
* @param name 属性名
* @param value 值
* @param 范型
*/
public static void setSimpleProperty(final T instance, final String name, final Object value) {
final PropertyDescriptor descriptor = getDescriptor(instance.getClass(), name);
final Method method = descriptor.getWriteMethod();
MethodUtil.invoke(instance, method, value);
}
/**
* map转对象
*
* @param maps 键值对
* @param clazz 要转换成的类
* @param 范型
* @return 设置好参数的对象
*/
public static T mapToBean(final Map maps, final Class clazz) {
final T instance = ClassUtil.newInstance(clazz);
PropertyDescriptor descriptor;
Method method;
for (final Map.Entry entry : maps.entrySet()) {
descriptor = getDescriptor(clazz, entry.getKey());
if (!Objects.isNull(descriptor)) {
method = descriptor.getWriteMethod();
MethodUtil.invoke(instance, method, entry.getValue());
}
}
return instance;
}
/**
* 对象转map
*
* @param instance 实例
* @param 范型
* @return 实例的键值对
*/
public static Map beanToMap(final T instance) {
final PropertyDescriptor[] descriptors = getPropertyDescriptors(instance.getClass());
final Map maps = MapUtil.newHashMap(descriptors.length);
for (final PropertyDescriptor descriptor : descriptors) {
final String name = descriptor.getName();
if (!CLASS.equals(name)) {
final Object value = getSimpleProperty(instance, name);
if (!Objects.isNull(value)) {
maps.put(name, value);
}
}
}
return maps;
}
/**
* 复制Bean对象属性
*
* @param source 源
* @param target 目标
* @param editable target的父类,只复制target父类中的属性
* @param ignoreProperties 忽略的属性值
*/
public static void copyProperties(final Object source, final Object target, final Class> editable,
final String... ignoreProperties) {
final Class> actualEditable = !Objects.isNull(editable) && editable.isInstance(target) ? editable : target.getClass();
final PropertyDescriptor[] sourceDescriptors = getPropertyDescriptors(source.getClass());
for (final PropertyDescriptor sourceDescriptor : sourceDescriptors) {
final String name = sourceDescriptor.getName();
if (CLASS.equals(name) || ArrayUtil.contains(ignoreProperties, name)) {
continue;
}
final PropertyDescriptor targetDescriptor = getDescriptor(actualEditable, name);
if (!Objects.isNull(targetDescriptor)) {
final Object value = getSimpleProperty(source, name);
if (!Objects.isNull(value)) {
setSimpleProperty(target, name, value);
}
}
}
}
/**
* 获得实例中指定的propertydescriptor
*
* @param clazz 实例
* @param name 属性名
* @param 泛型
* @return 返回propertydescriptor
*/
private static PropertyDescriptor getDescriptor(final Class clazz, final String name) {
final PropertyDescriptor[] descriptors = getPropertyDescriptors(clazz);
try {
return Stream.of(descriptors).filter(desc -> name.equals(desc.getName())).findFirst().orElse(new
PropertyDescriptor(name, clazz));
} catch (IntrospectionException e) {
throw new ToolException(
StringUtil.format("get instance {}'s fileld {}'s propertyDescriptor failure,the reason is: {}", ClassUtil.getClassName
(clazz, false), name, e.getMessage()), e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy