-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
990 additions
and
0 deletions.
There are no files selected for viewing
23 changes: 23 additions & 0 deletions
23
bubble-core/src/main/java/cn/fxbin/bubble/core/constant/SpringEnvConst.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package cn.fxbin.bubble.core.constant; | ||
|
||
/** | ||
* SpringConst | ||
* | ||
* @author fxbin | ||
* @version v1.0 | ||
* @since 2023/9/11 23:39 | ||
*/ | ||
public interface SpringEnvConst { | ||
|
||
/** | ||
* The name of the SpringBoot Application Name | ||
*/ | ||
String APPLICATION_NAME = "spring.application.name"; | ||
|
||
/** | ||
* The name of the SpringBoot profiles active | ||
*/ | ||
String SPRING_PROFILES_ACTIVE = "spring.profiles.active"; | ||
|
||
|
||
} |
246 changes: 246 additions & 0 deletions
246
bubble-core/src/main/java/cn/fxbin/bubble/core/util/ReflectUtils.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,246 @@ | ||
package cn.fxbin.bubble.core.util; | ||
|
||
import cn.hutool.core.util.ReflectUtil; | ||
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; | ||
|
||
/** | ||
* ReflectUtils | ||
* | ||
* @author fxbin | ||
* @version v1.0 | ||
* @since 2023/9/11 14:29 | ||
*/ | ||
public class ReflectUtils extends ReflectionUtils { | ||
|
||
/** | ||
* 获取 Bean 的所有 get方法 | ||
* | ||
* @param type 类 | ||
* @return PropertyDescriptor数组 | ||
*/ | ||
public static PropertyDescriptor[] getBeanGetters(Class<?> type) { | ||
return getPropertyDescriptors(type, true, false); | ||
} | ||
|
||
/** | ||
* 获取 Bean 的所有 set方法 | ||
* | ||
* @param type 类 | ||
* @return PropertyDescriptor数组 | ||
*/ | ||
public static PropertyDescriptor[] getBeanSetters(Class<?> type) { | ||
return getPropertyDescriptors(type, false, true); | ||
} | ||
|
||
/** | ||
* 获取 Bean 的所有 PropertyDescriptor | ||
* | ||
* @param type 类 | ||
* @param read 读取方法 | ||
* @param write 写方法 | ||
* @return PropertyDescriptor数组 | ||
*/ | ||
public static PropertyDescriptor[] getPropertyDescriptors(Class type, boolean read, boolean write) { | ||
try { | ||
PropertyDescriptor[] all = BeanUtils.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 = BeanUtils.getPropertyDescriptor(propertyType, propertyName); | ||
if (propertyDescriptor == null) { | ||
return null; | ||
} | ||
return ReflectUtils.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 = ReflectUtils.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); | ||
} | ||
|
||
|
||
/** | ||
* 重写 setField 的方法,用于处理 setAccessible 的问题 | ||
* | ||
* @param field Field | ||
* @param target Object | ||
* @param value value | ||
*/ | ||
public static void setField(Field field, @Nullable Object target, @Nullable Object value) { | ||
makeAccessible(field); | ||
ReflectionUtils.setField(field, target, value); | ||
} | ||
|
||
/** | ||
* 重写 setField 的方法,用于处理 setAccessible 的问题 | ||
* | ||
* @param field Field | ||
* @param target Object | ||
* @return value | ||
*/ | ||
@Nullable | ||
public static Object getField(Field field, @Nullable Object target) { | ||
makeAccessible(field); | ||
return ReflectionUtils.getField(field, target); | ||
} | ||
|
||
/** | ||
* 重写 setField 的方法,用于处理 setAccessible 的问题 | ||
* | ||
* @param fieldName Field name | ||
* @param target Object | ||
* @return value | ||
*/ | ||
@Nullable | ||
public static Object getField(String fieldName, @Nullable Object target) { | ||
if (target == null) { | ||
return null; | ||
} | ||
Class<?> targetClass = target.getClass(); | ||
Field field = getField(targetClass, fieldName); | ||
if (field == null) { | ||
throw new IllegalArgumentException(fieldName + " not in" + targetClass); | ||
} | ||
return getField(field, target); | ||
} | ||
|
||
/** | ||
* 重写 invokeMethod 的方法,用于处理 setAccessible 的问题 | ||
* | ||
* @param method Method | ||
* @param target Object | ||
* @return value | ||
*/ | ||
@Nullable | ||
public static Object invokeMethod(Method method, @Nullable Object target) { | ||
return ReflectUtils.invokeMethod(method, target, new Object[0]); | ||
} | ||
|
||
/** | ||
* 重写 invokeMethod 的方法,用于处理 setAccessible 的问题 | ||
* | ||
* @param method Method | ||
* @param target Object | ||
* @param args args | ||
* @return value | ||
*/ | ||
@Nullable | ||
public static Object invokeMethod(Method method, @Nullable Object target, @Nullable Object... args) { | ||
makeAccessible(method); | ||
return ReflectionUtils.invokeMethod(method, target, args); | ||
} | ||
|
||
} |
Oops, something went wrong.