package com.tencent.tws.assistant.utils; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import android.util.Log; public class ReflectUtils { private static final String TAG = "com.tencent.tws.assistant.utils.ReflectUtils"; public static int gCallFieldNums = 0; public static int gCallMethodNums = 0; private static HashMap<String, ReflectClassComponent> mReflectFileds = new HashMap<String, ReflectClassComponent>(); static class ReflectClassComponent{ //String clsName; HashMap<String, Field> fields; HashMap<String, Method> methods; //method_name + param } public ReflectUtils() { // TODO Auto-generated constructor stub } public static Field getDeclaredField(Class<?> cls, String fieldName) { ReflectClassComponent tmpRcc = mReflectFileds.get(cls.getName()); if (tmpRcc == null) { tmpRcc = new ReflectClassComponent(); tmpRcc.fields = new HashMap<String, Field>(); tmpRcc.methods = new HashMap<String, Method>(); mReflectFileds.put(cls.getName(), tmpRcc); } Field field = tmpRcc.fields.get(fieldName); if (field != null) { //Log.d(TAG, "getDeclaredField| field=" + field.getName()); return field; } //Log.d(TAG, "getDeclaredField|cls.getName=" + cls.getName() + ", fieldName=" + fieldName + ", tmpRcc.fields.size =" + tmpRcc.fields.size()); gCallFieldNums ++ ; try { field = cls.getDeclaredField(fieldName); field.setAccessible(true); tmpRcc.fields.put(fieldName, field); return field; } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "getFieldValue|cls=" + cls + ", fieldName=" + fieldName); return null; } public static Object getFieldValue(Field field, Object object) { try { return field.get(object); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "getFieldValue|field="+field); return null; } @Deprecated public static Object getFieldValue(String fieldName, Object object) { Field field = getDeclaredField(object.getClass(), fieldName); return getFieldValue(field, object); } public static Object getFieldValue(String fieldName, Object object, Class<?> clz) { Field field = getDeclaredField(clz, fieldName); return getFieldValue(field, object); } public static void setFieldValue(Object object, Field field, Object value) { try { field.set(object, value); return; } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Log.d(TAG, "setFieldValue|field=" + field + ", value="+value); } public static Method getDeclaredMethod(Class<?> clz, String methodName, Class<?>... parameterTypes) { if(clz == null) return null; ReflectClassComponent tmpRcc = mReflectFileds.get(clz.getName()); if (tmpRcc == null) { tmpRcc = new ReflectClassComponent(); tmpRcc.fields = new HashMap<String, Field>(); tmpRcc.methods = new HashMap<String, Method>(); mReflectFileds.put(clz.getName(), tmpRcc); } String methodKey = new String(methodName); //methodName+param int len = parameterTypes.length; for (int i = 0; i < len; i++) { methodKey = methodKey + "_" + parameterTypes[i].getSimpleName(); } Method method = tmpRcc.methods.get(methodKey); if (method != null) { return method; } //Log.d(TAG, "getDeclaredMethod|clz=" + clz.getName() + ", methodKey=" + methodKey); gCallMethodNums ++ ; try { method = clz.getDeclaredMethod(methodName, parameterTypes); method.setAccessible(true); tmpRcc.methods.put(methodKey, method); return method; } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "getDeclaredMethod|clz=" + clz + ", methodName=" + methodName); return null; } public static Constructor<?> getDeclaredConstructor(Class<?> clz, Class<?>... parameterTypes) { gCallMethodNums ++ ; try { Constructor<?> constructor = clz.getDeclaredConstructor(parameterTypes); constructor.setAccessible(true); return constructor; } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "getDeclaredConstructor|clz="+clz); return null; } public static Object invoke(Method method, Object receiver, Object... args) { if(method == null) return null; try { return method.invoke(receiver, args); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "invoke|method="+method); return null; } public static Class<?> forClassName(String className) { try { return Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } Log.e(TAG, "forClassName|className="+className); return null; } }