在实际的项目开发中,反射操作类的实例、属性赋值、执行方法是常规的操作,虽然spring提供了比较完整的API来执行上述操作,不过在实际的应用中,spring的函数隐藏比较深,比较分散,小伙伴们可能懒得花时间去寻找。本类集成了一些常规操作,值得收藏,请关注展翅,展翅会定时更新有项目实战价值的代码和技术。
<code>
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.util.ObjectUtils;
import com.esotericsoftware.reflectasm.MethodAccess;
import com.ivt.monitor.utils.common.CommonUtils;
import com.ivt.monitor.utils.common.StringUtil;
public class ReflectASMUtils {
\t/**
\t * Class,MethodAccess的缓存map
\t */
\tprivate static Map<class>, MethodAccess> classMethodAccessMap;
\tstatic{
\t\tclassMethodAccessMap = new HashMap<class>, MethodAccess>();
\t}
\t
\t/**
\t * 根据字段名获取对应的bean的值
\t * 为了避免因为bean的set,get不规范而出异常,加上PropertyUtils.getProperty(bean, field);
\t * @param bean
\t * @param field
\t * @return
\t * @throws NoSuchMethodException
\t * @throws InvocationTargetException
\t * @throws IllegalAccessException
\t */
\tpublic static Object getProperty(Object bean, String field) throws IllegalAccessException,
\tInvocationTargetException, NoSuchMethodException{\t\t
\t\ttry{\t\t
\t\t\tClass> clazz = bean.getClass(); \t\t\t
\t\t\tString methodName = "get".concat(field.substring(0, 1).toUpperCase()
\t\t\t\t\t.concat(field.substring(1, field.length())));\t\t\t
\t\t\tMethodAccess access = getCacheMethodAccess(clazz);
\t\t\tObject obj = access.invoke(bean, methodName);\t\t\t
\t\t\t/*if(obj != null && obj instanceof Date){
\t\t\t\t
\t\t\t\tobj = CommonUtils.getDateString((Date) obj);
\t\t\t}*/
\t\t\t
\t\t\treturn obj;
\t\t\t
\t\t}catch (Exception e) {\t\t
\t\t\treturn PropertyUtils.getProperty(bean, field);
\t\t}
\t}
\t
\t/**
\t * 根据字段名为bean设置对应的值
\t * 为了避免因为bean的set,get不规范而出异常,加上PropertyUtils.setProperty(bean, field, value);
\t * @param bean
\t * @param field
\t * @param value
\t * @throws NoSuchMethodException
\t * @throws InvocationTargetException
\t * @throws IllegalAccessException
\t */
\tpublic static void setProperty(Object bean, String field, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
\t\t
\t\ttry{
\t\t\t
\t\t\tClass> clazz = bean.getClass();
\t\t\t
\t\t\tString methodName = "set".concat(field.substring(0, 1).toUpperCase().concat(field.substring(1, field.length())));
\t\t\t
\t\t\tMethodAccess access = getCacheMethodAccess(clazz);
\t\t\taccess.invoke(bean, methodName, value);
\t\t}catch (Exception e) {
\t\t\t
\t\t\tPropertyUtils.setProperty(bean, field, value);
\t\t}
\t}
\t
\t////////////
\t
\t/**
\t * map返回成一个bean
\t * @param clazz
\t * @param map
\t * @return
\t */
\tpublic static T setBeanValue(Class clazz, Map<string> map){\t\t
\t\ttry{\t\t\t
\t\t\tT bean = clazz.newInstance();\t\t\t
\t\t\tif(bean == null || CommonUtils.isCollectionEmpty(map)){\t\t\t\t
\t\t\t\treturn null;
\t\t\t}\t\t\t
\t\t\tSet<string> keys = map.keySet();
\t\t\tfor(String field : keys){\t\t\t\t
\t\t\t\tString methodName = "set".concat(field.substring(0, 1).toUpperCase().
\t\t\t\t\t\tconcat(field.substring(1, field.length())));\t\t\t\t
\t\t\t\tMethodAccess access = getCacheMethodAccess(clazz);
\t\t\t\taccess.invoke(bean, methodName, map.get(field));\t\t\t\t
\t\t\t}\t\t\t
\t\t\treturn bean;\t\t\t
\t\t}catch(Exception e){\t\t\t
\t\t\treturn null;
\t\t}
\t\t
\t}
\t
\t/**
\t * mapList返回成一个bean list
\t * @param clazz
\t * @param mapList
\t * @return
\t */
\tpublic static List setBeanListValue(Class clazz, List/<string>/<string>/<class>/<class>/<code>
閱讀更多 程序展翅
的文章
關鍵字:
比较
属性
操作