xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/utils/ReflectUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,180 @@
/*
 *      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.springblade.core.tool.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 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);
   }
}