All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xiaoleilu.hutool.bean.BeanDesc Maven / Gradle / Ivy

package com.xiaoleilu.hutool.bean;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import com.xiaoleilu.hutool.collection.CaseInsensitiveMap;
import com.xiaoleilu.hutool.lang.Assert;
import com.xiaoleilu.hutool.util.ClassUtil;
import com.xiaoleilu.hutool.util.ReflectUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import com.xiaoleilu.hutool.util.TypeUtil;

/**
 * Bean信息描述做为BeanInfo替代方案,此对象持有JavaBean中的setters和getters等相关信息描述
 * 
 * @author looly
 * @since 3.1.2
 */
public class BeanDesc {
	
	/** Bean类 */
	private Class beanClass;
	/** 属性Map */
	private Map propMap = new HashMap<>();
	
	/**
	 * 构造
	 * @param beanClass Bean类
	 */
	public BeanDesc(Class beanClass) {
		Assert.notNull(beanClass);
		this.beanClass = beanClass;
		init();
	}
	
	/**
	 * 获取Bean的全类名
	 * @return Bean的类名
	 */
	public String getName() {
		return this.beanClass.getName();
	}
	
	/**
	 * 获取Bean的简单类名
	 * @return Bean的类名
	 */
	public String getSimpleName() {
		return this.beanClass.getSimpleName();
	}
	
	/**
	 * 获取字段名-字段属性Map
	 * 
	 * @param ignoreCase 是否忽略大小写,true为忽略,false不忽略
	 * @return 字段名-字段属性Map
	 */
	public Map getPropMap(boolean ignoreCase) {
		return ignoreCase ? new CaseInsensitiveMap<>(1, this.propMap) : this.propMap;
	}
	
	/**
	 * 获取字段名-字段属性Map
	 * @return {@link PropDesc} 列表
	 */
	public Collection getProps() {
		return this.propMap.values();
	}
	
	/**
	 * 获取属性,如果不存在返回null
	 * @param fieldName 字段名
	 * @return {@link PropDesc}
	 */
	public PropDesc getProp(String fieldName) {
		return this.propMap.get(fieldName);
	}
	
	/**
	 * 获得字段名对应的字段对象,如果不存在返回null
	 * @param fieldName 字段名
	 * @return 字段值
	 */
	public Field getField(String fieldName) {
		final PropDesc desc = this.propMap.get(fieldName);
		return null == desc ? null : desc.getField();
	}
	
	/**
	 * 获取Getter方法,如果不存在返回null
	 * @param fieldName 字段名
	 * @return Getter方法
	 */
	public Method getGetter(String fieldName) {
		final PropDesc desc = this.propMap.get(fieldName);
		return null == desc ? null : desc.getGetter();
	}
	
	/**
	 * 获取Setter方法,如果不存在返回null
	 * @param fieldName 字段名
	 * @return Setter方法
	 */
	public Method getSetter(String fieldName) {
		final PropDesc desc = this.propMap.get(fieldName);
		return null == desc ? null : desc.getSetter();
	}
	
	/**
	 * 初始化
	 * @return this
	 */
	private BeanDesc init() {
		final Field[] fields = ReflectUtil.getFields(this.beanClass);
		
		String fieldName;
		Class fieldType;
		Method getter;
		Method setter;
		for (Field field : fields) {
			fieldName = field.getName();
			fieldType = field.getType();
			if(fieldType == Boolean.class || fieldType == boolean.class) {
				//Boolean和boolean类型特殊处理
				fieldName = StrUtil.removePrefix(fieldName, "is");
				getter = ReflectUtil.getMethodIgnoreCase(this.beanClass, StrUtil.upperFirstAndAddPre(fieldName, "is"));
				if(null == getter) {
					getter = ReflectUtil.getMethodIgnoreCase(this.beanClass, StrUtil.genGetter(fieldName));
				}
				
			}else {
				getter = ReflectUtil.getMethodIgnoreCase(this.beanClass, StrUtil.genGetter(fieldName));
			}
			
			setter = ReflectUtil.getMethodIgnoreCase(this.beanClass, StrUtil.genSetter(fieldName), field.getType());
			this.propMap.put(fieldName, new PropDesc(field, getter, setter));
		}
		return this;
	}

	/**
	 * 属性描述
	 * @author looly
	 *
	 */
	public static class PropDesc {
		
		/** 字段 */
		private Field field;
		/** Getter方法 */
		private Method getter;
		/** Setter方法 */
		private Method setter;
		
		/**
		 * 构造
* Getter和Setter方法设置为默认可访问 * * @param field 字段 * @param getter get方法 * @param setter set方法 */ public PropDesc(Field field, Method getter, Method setter) { this.field = field; this.getter = ClassUtil.setAccessible(getter); this.setter = ClassUtil.setAccessible(setter); } /** * 获取字段名 * @return 字段名 */ public String getFieldName() { return null == this.field ? null : this.field.getName(); } /** * 获取字段 * @return 字段 */ public Field getField() { return this.field; } /** * 获得字段类型
* 先获取字段的类型,如果字段不存在,则获取Getter方法的返回类型,否则获取Setter的第一个参数类型 * * @return 字段类型 */ public Type getFieldType() { if(null != this.field) { return TypeUtil.getType(this.field); } return findPropType(getter, setter); } /** * 获得字段类型
* 先获取字段的类型,如果字段不存在,则获取Getter方法的返回类型,否则获取Setter的第一个参数类型 * * @return 字段类型 */ public Class getFieldClass() { if(null != this.field) { return TypeUtil.getClass(this.field); } return findPropClass(getter, setter); } /** * 获取Getter方法 * @return Getter方法 */ public Method getGetter() { return this.getter; } /** * 获取Setter方法 * * @return {@link Method}Setter 方法对象 */ public Method getSetter() { return this.setter; } /** * 通过Getter和Setter方法中找到属性类型 * @param getter Getter方法 * @param setter Setter方法 * @return {@link Type} */ private Type findPropType(Method getter, Method setter) { Type type = null; if(null != getter) { type = TypeUtil.getReturnType(getter); } if(null == type && null != setter) { type = TypeUtil.getParamType(setter, 0); } return type; } /** * 通过Getter和Setter方法中找到属性类型 * @param getter Getter方法 * @param setter Setter方法 * @return {@link Type} */ private Class findPropClass(Method getter, Method setter) { Class type = null; if(null != getter) { type = TypeUtil.getReturnClass(getter); } if(null == type && null != setter) { type = TypeUtil.getFirstParamClass(setter); } return type; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy