/* * Copyright (c) 2018-2028, DreamLu All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: DreamLu 卢春梦 (596392912@qq.com) */ package org.springnewfiber.dataadapter.sswj.util; import cn.hutool.core.bean.BeanUtil; 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.Assert; 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 L.cm */ 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<PropertyDescriptor> 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 clazz 类 * @param fieldName 属性名 * @param annotationClass 注解 * @param <T> 注解泛型 * @return 注解 */ @Nullable public static <T extends Annotation> T getAnnotation(Class<?> clazz, String fieldName, Class<T> annotationClass) { Field field = ReflectUtil.getField(clazz, fieldName); if (field == null) { return null; } return field.getAnnotation(annotationClass); } public static void setField(String fieldName, @Nullable Object target, @Nullable Object value) { Assert.notNull(target, "target can not be null"); Assert.notNull(fieldName, "fieldName can not be null"); Field field = getField(target.getClass(), fieldName); Assert.notNull(field, "field is not exists"); setField(field, target, value); } }