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

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

There is a newer version: 3.3.2
Show newest version
package com.xiaoleilu.hutool.bean;

import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Map;

import com.xiaoleilu.hutool.clone.CloneSupport;
import com.xiaoleilu.hutool.lang.Assert;
import com.xiaoleilu.hutool.util.BeanUtil;
import com.xiaoleilu.hutool.util.ClassUtil;

/**
 * 动态Bean,通过反射对Bean的相关方法做操作
* 支持Map和普通Bean * * @author Looly * @since 3.0.7 */ public class DynaBean extends CloneSupport implements Serializable{ private static final long serialVersionUID = 1197818330017827323L; private Class beanClass; private Object bean; /** * 创建一个{@link DynaBean} * @param bean 普通Bean * @return {@link DynaBean} */ public static DynaBean create(Object bean){ return new DynaBean(bean); } /** * 创建一个{@link DynaBean} * @param beanClass Bean类 * @param params 构造Bean所需要的参数 * @return {@link DynaBean} */ public static DynaBean create(Class beanClass, Object... params){ return new DynaBean(beanClass, params); } //------------------------------------------------------------------------ Constructor start /** * 构造 * @param beanClass Bean类 * @param params 构造Bean所需要的参数 */ public DynaBean(Class beanClass, Object... params){ this(ClassUtil.newInstance(beanClass, params)); } /** * 构造 * @param bean 原始Bean */ public DynaBean(Object bean){ Assert.notNull(bean); if(bean instanceof DynaBean){ bean = ((DynaBean)bean).getBean(); } this.bean = bean; this.beanClass = ClassUtil.getClass(bean); } //------------------------------------------------------------------------ Constructor end /** * 获得字段对应值 * @param 属性值类型 * @param fieldName 字段名 * @return 字段值 * @throws BeanException 反射获取属性值或字段值导致的异常 */ @SuppressWarnings("unchecked") public T get(String fieldName) throws BeanException{ if(Map.class.isAssignableFrom(beanClass)){ return (T) ((Map)bean).get(fieldName); }else{ try { final PropertyDescriptor descriptor = BeanUtil.getPropertyDescriptor(beanClass, fieldName); if(null == descriptor){ throw new BeanException("No PropertyDescriptor for {}", fieldName); } final Method method = descriptor.getReadMethod(); if(null == method){ throw new BeanException("No set method for {}", fieldName); } return (T) method.invoke(this.bean); } catch (Exception e) { throw new BeanException(e); } } } /** * 设置字段值 * @param fieldName 字段名 * @param value 字段值 * @throws BeanException 反射获取属性值或字段值导致的异常 */ @SuppressWarnings({ "unchecked", "rawtypes" }) public void set(String fieldName, Object value) throws BeanException{ if(Map.class.isAssignableFrom(beanClass)){ ((Map)bean).put(fieldName, value); return; }else{ try { final PropertyDescriptor descriptor = BeanUtil.getPropertyDescriptor(beanClass, fieldName); if(null == descriptor){ throw new BeanException("No PropertyDescriptor for {}", fieldName); } final Method method = descriptor.getWriteMethod(); if(null == method){ throw new BeanException("No set method for {}", fieldName); } method.invoke(this.bean, value); } catch (Exception e) { throw new BeanException(e); } } } /** * 执行原始Bean中的方法 * @param methodName 方法名 * @param params 参数 * @return 执行结果,可能为null */ public Object invoke(String methodName, Object... params){ return ClassUtil.invoke(this.bean, methodName, params); } /** * 获得原始Bean * @param Bean类型 * @return bean */ @SuppressWarnings("unchecked") public T getBean(){ return (T)this.bean; } /** * 获得Bean的类型 * @param Bean类型 * @return Bean类型 */ @SuppressWarnings("unchecked") public Class getBeanClass(){ return (Class) this.beanClass; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((bean == null) ? 0 : bean.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final DynaBean other = (DynaBean) obj; if (bean == null) { if (other.bean != null) { return false; } } else if (!bean.equals(other.bean)) { return false; } return true; } @Override public String toString() { return this.bean.toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy