在實際的項目開發中,反射操作類的實例、屬性賦值、執行方法是常規的操作,雖然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>
閱讀更多 程序展翅
的文章
關鍵字:
屬性
操作
比較