Package cn.xuanyuanli.core.util
Class Beans
java.lang.Object
cn.xuanyuanli.core.util.Beans
关于类操作的,都在这里
用到工具类BeanUtils,把抛出的异常屏蔽了
其他类操作工具类,参考:FieldUtils、MethodUtils等
泛型操作这里是自己写了,也可以考虑使用Spring的ResolvableType
类型转换使用了ConvertUtilsBean,可以考虑Spring的DefaultConversionService
- Author:
- John Li Email:jujubeframework@163.com
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescription基本类型封装类列表private static final ConcurrentMap<String, BeanInfo> beaninfo缓存private static final ConcurrentMap<String, Class<?>> classgenerictype缓存private static final org.apache.commons.beanutils.ConvertUtilsBean转换工具类private static final ConcurrentMap<String, AtomicReference<Method>> 声明方法缓存private static final org.springframework.core.ParameterNameDiscovererParameterNameDiscoverer的对象private static interrlogprivate static final ConcurrentMap<String, AtomicReference<Field>> 字段缓存private static final ConcurrentMap<String, List<String>> 缓存字段名private static final org.slf4j.Logger日志记录器private static final ConcurrentMap<String, AtomicReference<Method>> ConcurrentMap.computeIfAbsent不能递归调用,所以建立三个方法的缓存private static final ConcurrentMap<String, AtomicReference<PropertyDescriptor>> PropertyDescriptor的缓存。private static final ConcurrentMap<String, AtomicReference<Method>> 自我声明方法缓存private static final ConcurrentMap<String, AtomicReference<Field>> 自我字段缓存 -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription把对象转换为map把对象转换为map(Cglib的BeanMap性能最高)static List<Beans.FieldDidderence> contrastObject(Object oldObject, Object newObject) 对比两个对象,获取差异字段集合private static <T> T值类型转换,copy自BeanUtils.convertstatic Class<?> 根据Class的完整限定名装配ClassgetAllDeclaredFieldNames(Class<?> clazz) 获得所有可访问的字段名(包括父类)集合getAllInterfacesAndParentClass(Class<?> clazz) 获得所有接口和父类private static BeanInfogetBeanInfo(Class<?> targetClass) 根据Class获得类信息static <T> Class<T> getClassGenericType(Class<?> clazz) 通过反射, 获得Class定义中声明的泛型参数的类型(先找父类,后找接口)。static Class<?> getClassGenericType(Class<?> clazz, int index) 通过反射, 获得Class定义中声明的父类(或接口,如果是接口的话,默认获得第一个泛型接口)的泛型参数的类型。static FieldgetDeclaredField(Class<?> clazz, String fieldName) 获得类的所有声明字段,包括父类中的static MethodgetDeclaredMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) 获得类的所有声明方法,包括父类和接口中的static ClassLoader获得当前项目(jar)的ClassLoaderstatic <T> TgetExpectTypeValue(Object o, Class<T> returnType) 获得预期类型的值getFormalParamSimpleMapping(Method method, Object... args) 获得形参名和形参值的简单对照表(name-value)static <T> TgetInstance(Class<T> cl) 根据类获得实例private static voidgetInterfaces(Class<?> clazz, Set<Class<?>> classes) 获得接口static Method获得所有的public方法static String[]getMethodParamNames(Method method) 获取方法的形参名集合static Class<?> getMethodReturnParameterizedTypeFirst(Method method, Class<?> defaultClass) 获得方法参数化返回值的第一个类型static <T> TgetObjcetFromMethodArgs(Object[] methodArgs, Class<T> clazz) 从方法实参中获得对应类型的对象static ObjectgetProperty(Object bean, String name) 自己实现的getter方法(解决字段第二个字母为大写的情况)static StringgetPropertyAsString(Object bean, String name) 通过getter方法来获取转换为String后的指static PropertyDescriptorgetPropertyDescriptor(Class<?> targetClass, String fieldName) 获得类的某个字段属性描述private static PropertyDescriptorgetPropertyDescriptorFromBeanInfo(BeanInfo beanInfo, String fieldName) 从BeanInfo中获取字段属性描述器static FieldgetSelfDeclaredField(Class<?> cl, String fieldName) 获得类的所有声明字段,不包括父类中的static MethodgetSelfDeclaredMethod(Class<?> cl, String methodName, Class<?>... parameterTypes) 获得类的所有声明方法,不包括父类中的static Object反射调用方法static ObjectinvokeDefaultMethod(Object proxy, Method method, Object... args) 反射调用default方法static ObjectinvokeDefaultMethod(Method method, Object... args) 反射调用default方法(不支持default方法中再次调用本接口的其他default方法)static booleanisBasicType(Class<?> cl) 是否是基本数据类型static voidsetProperty(Object bean, String name, Object value) 自己实现的set方法(解决链式调用后setProperty不管用的情况)
-
Field Details
-
logger
private static final org.slf4j.Logger logger日志记录器 -
PROPERTY_DESCRIPTOR_CACHE
private static final ConcurrentMap<String,AtomicReference<PropertyDescriptor>> PROPERTY_DESCRIPTOR_CACHEPropertyDescriptor的缓存。key为classname+fieldName,value使用AtomicReference包装,因为ConcurrentMap不支持空值 -
METHOD_CACHE
ConcurrentMap.computeIfAbsent不能递归调用,所以建立三个方法的缓存 -
DECLARED_METHOD_CACHE
声明方法缓存 -
SELF_DECLARED_METHOD_CACHE
自我声明方法缓存 -
BEANINFO_CACHE
beaninfo缓存 -
FIELDNAMES_CACHE
缓存字段名 -
CLASSGENERICTYPE_CACHE
classgenerictype缓存 -
FIELD_CACHE
字段缓存 -
SELF_FIELD_CACHE
自我字段缓存 -
DISCOVERER
private static final org.springframework.core.ParameterNameDiscoverer DISCOVERERParameterNameDiscoverer的对象 -
BASIC_TYPE
基本类型封装类列表 -
CONVERT_UTILS_BEAN
private static final org.apache.commons.beanutils.ConvertUtilsBean CONVERT_UTILS_BEAN转换工具类 -
errlog
private static int errlogerrlog
-
-
Constructor Details
-
Beans
public Beans()
-
-
Method Details
-
beanToMap
把对象转换为map -
beanToMap
把对象转换为map(Cglib的BeanMap性能最高) -
getInstance
根据类获得实例- Type Parameters:
T- 泛型- Parameters:
cl- cl- Returns:
Beans
-
forName
根据Class的完整限定名装配Class- Parameters:
className- 类名- Returns:
Classinvalid input: '<'}>invalid @link
{@link ?
-
setProperty
自己实现的set方法(解决链式调用后setProperty不管用的情况)- Parameters:
bean- 豆name- 名字value- 价值
-
convert
值类型转换,copy自BeanUtils.convert- Parameters:
value- 价值type- 类型- Returns:
Beans
-
getProperty
自己实现的getter方法(解决字段第二个字母为大写的情况)- Parameters:
bean- 豆name- 名字- Returns:
Object
-
getPropertyAsString
通过getter方法来获取转换为String后的指- Parameters:
bean- 豆name- 名字- Returns:
String
-
getMethod
获得所有的public方法- Parameters:
cl- clmethodName- 方法名称parameterTypes- 参数类型- Returns:
Method
-
getDeclaredMethod
public static Method getDeclaredMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) 获得类的所有声明方法,包括父类和接口中的- Parameters:
clazz- clazzmethodName- 方法名称parameterTypes- 参数类型- Returns:
Method
-
getAllInterfacesAndParentClass
获得所有接口和父类 -
getInterfaces
获得接口- Parameters:
clazz- clazzclasses- 类
-
getSelfDeclaredMethod
public static Method getSelfDeclaredMethod(Class<?> cl, String methodName, Class<?>... parameterTypes) 获得类的所有声明方法,不包括父类中的- Parameters:
cl- clmethodName- 方法名称parameterTypes- 参数类型- Returns:
Method
-
invoke
反射调用方法- Parameters:
method- 方法obj- objargs- arg游戏- Returns:
Object
-
invokeDefaultMethod
反射调用default方法(不支持default方法中再次调用本接口的其他default方法)- Parameters:
method- 方法args- 方法参数- Returns:
Object
-
invokeDefaultMethod
public static Object invokeDefaultMethod(Object proxy, Method method, Object... args) throws Throwable 反射调用default方法 -
getDeclaredField
获得类的所有声明字段,包括父类中的- Parameters:
clazz- clazzfieldName- 字段名- Returns:
Field
-
getSelfDeclaredField
获得类的所有声明字段,不包括父类中的- Parameters:
cl- clfieldName- 字段名- Returns:
Field
-
getBeanInfo
根据Class获得类信息- Parameters:
targetClass- 目标类- Returns:
BeanInfo
-
getPropertyDescriptor
获得类的某个字段属性描述- Parameters:
targetClass- 目标类fieldName- 字段名- Returns:
PropertyDescriptor
-
getPropertyDescriptorFromBeanInfo
private static PropertyDescriptor getPropertyDescriptorFromBeanInfo(BeanInfo beanInfo, String fieldName) 从BeanInfo中获取字段属性描述器- Parameters:
beanInfo- bean信息fieldName- 字段名- Returns:
PropertyDescriptor
-
getFormalParamSimpleMapping
获得形参名和形参值的简单对照表(name-value) -
getMethodParamNames
获取方法的形参名集合- Parameters:
method- 方法- Returns:
String
-
getAllDeclaredFieldNames
获得所有可访问的字段名(包括父类)集合 -
contrastObject
对比两个对象,获取差异字段集合- Parameters:
oldObject- 旧对象newObject- 新对象- Returns:
Listinvalid input: '<'Beans.FieldDidderence>
-
getClassGenericType
通过反射, 获得Class定义中声明的泛型参数的类型(先找父类,后找接口)。如无法找到, 返回Object.class.- Type Parameters:
T- 泛型- Parameters:
clazz- The class to introspect- Returns:
- the first generic declaration, or Object.class if you cannot be determined
-
getClassGenericType
通过反射, 获得Class定义中声明的父类(或接口,如果是接口的话,默认获得第一个泛型接口)的泛型参数的类型。如无法找到, 返回Object.class.- Parameters:
clazz- clazz The class to introspectindex- the Index of the generic ddeclaration,start from 0.- Returns:
- the index generic declaration, or Object.class if you cannot be determined
-
getDefaultClassLoader
获得当前项目(jar)的ClassLoader- Returns:
ClassLoader
-
isBasicType
是否是基本数据类型- Parameters:
cl- cl- Returns:
- boolean
-
getObjcetFromMethodArgs
从方法实参中获得对应类型的对象- Type Parameters:
T- 泛型- Parameters:
methodArgs- 方法参数clazz- clazz- Returns:
Beans
-
getExpectTypeValue
获得预期类型的值- Type Parameters:
T- 泛型- Parameters:
o- oreturnType- 返回类型- Returns:
Beans
-
getMethodReturnParameterizedTypeFirst
获得方法参数化返回值的第一个类型- Parameters:
method- 方法defaultClass- 默认类型(在获取不到参数化类型时默认取这个值)- Returns:
Classinvalid input: '<'}>invalid @link
{@link ?
-