# AnnatationSample **Repository Path**: theoneee/annatation-sample ## Basic Information - **Project Name**: AnnatationSample - **Description**: Java 注解的使用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-08 - **Last Updated**: 2022-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 注解 [注解是什么?](https://www.cnblogs.com/Tanyboye/p/9138412.html) ## 使用 ``` java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InjectUtil.injectEvent(this); } @OnClick({R.id.button1,R.id.button2}) public void onClick(View view){ } @OnLongClick({R.id.button1,R.id.button2}) public boolean onLongClick(View view){ return false; } ``` ## 注入 ``` java public static void injectEvent(Activity activity){ Class activityClass = activity.getClass(); // 获取类里面所有的方法 Method[] methods = activityClass.getDeclaredMethods(); for (Method method:methods){ // 为了好理解,结合 【AnnotationActivity】 , 这里单独以 【onClick】 方法为示例讲 // TODO 获取【onClick方法】上所有的注解 Annotation[] annotations = method.getAnnotations(); for (Annotation annotation:annotations){ // 注解类型 Class annotationType = annotation.annotationType(); // 注解是包含了EventType注解 if(annotationType.isAnnotationPresent(EventType.class)){ // TODO 这里的 【annotationType】 也就是 【OnClick】 注解 // 拿到【OnClick注解】上的【EventType注解】 EventType eventType = annotationType.getAnnotation(EventType.class); // 拿到注接里面的值 OnClick注解里面写好的 Class listenerType = eventType.listenerType(); String listenerSetter = eventType.listenerSetter(); try { // TODO 拿到 OnClick 注解里的值 Method valueMethod = annotationType.getDeclaredMethod("value"); // 这里的 'value' 是 【OnClick注解】 里的方法名 // 可以为其他的,只不过直接写 value ,使用时不用再另外的指定,详情看【OnClick注解】里和【AnnotationActivity里onClick方法】注释的部分 // Method valueMethod = annotationType.getDeclaredMethod("ids"); int[] viewIds = (int[])valueMethod.invoke(annotation); method.setAccessible(true); // TODO 动态代理 // 相当于把【AnnotationActivity】里的【onClick】方法转移到了 // 本应该我们自己实现对【View】设置【点击监听】的【OnClickListener】方法 ListenerInvocationHandler handler = new ListenerInvocationHandler<>(activity,method); Object listenerProxy = Proxy.newProxyInstance(activity.getClassLoader(), new Class[]{listenerType}, handler); // 遍历注解的值 for (int id : viewIds){ // 获取当前Activity的View View view = activity.findViewById(id); // 获取指定方法 如:setOnClickListener方法,参数为OnClickListener // getMethod("setOnClickListener", View.OnClickListener.class) Method listener = view.getClass().getMethod(listenerSetter, listenerType); //执行setOnClickListener里面的回调 onClick方法 listener.invoke(view,listenerProxy); } } catch (Exception e) { e.printStackTrace(); } } } } } ```