1. 程式人生 > >通過註解埋點

通過註解埋點

由於專案原來毫無框架可言,現在又需要獲取程式的執行狀態,考慮到工作量以及後續維護,現通過註解解決問題

1、控制元件都是通過setOnClickListener加監聽的,現在要對所有的監聽加上其執行時間

步驟 1、添加註解類

         2、在BaseActivity中新增 

InjectUtils.inject(this);
3、
import android.app.Activity;
import android.graphics.Path;
import android.provider.SyncStateContract;
import android.util.Log;
import 
android.view.View; import java.lang.reflect.Field; /** * Created by 邱乾坤 on 2017/3/4. */ public class InjectUtils { public static long CLICK_TIME; public static void inject(Activity activity) { intectEvents(activity); } private static void intectEvents(Activity activity) { Class<? extends
Activity> clazz = activity.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { OnClick onClick = field.getAnnotation(OnClick.class); if (onClick != null) {
//發現控制元件
                int viewId = onClick.value();
                View view = activity.findViewById(viewId);
                Class viewClass = view.getClass();
                try 
{
//通過原始碼發現Listener是封裝在內部類的一個屬性,通過反射獲取內部類例項,在反射得到監聽事件,再通過代理模式獲取時間
                    Field field1 = viewClass.getSuperclass().getSuperclass().getDeclaredField("mListenerInfo");
                    field1.setAccessible(true);
                    Object target = field1.get(view);
                    //  Class aClass = Class.forName(field1.getType().getName());
Field field2 = target.getClass().getDeclaredField("mOnClickListener");
                    field2.setAccessible(true);
                    View.OnClickListener listener = (View.OnClickListener) field2.get(target);
                    view.setOnClickListener(new MyClickListener(listener));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static class MyClickListener implements View.OnClickListener {
        private View.OnClickListener listener;

        public MyClickListener(View.OnClickListener listener) {
            this.listener = listener;
        }

        @Override
public void onClick(View view) {
            //CLICK_TIME = 0;
CLICK_TIME = System.currentTimeMillis();
            Log.e("onClick", CLICK_TIME + "");
            listener.onClick(view);
        }
    }
}
對每個view加上註解即可