利用反射、注解、动态代理实现,onClick的注入

本文介绍了如何使用反射、注解和动态代理在Android中实现onClick事件的注入。通过创建@OnClick注解,定义方法并处理对应的视图ID,最后在injectOnClick方法中,通过反射获取注解信息,创建动态代理来设置点击监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface OnClick {

      int[] value();

}

@OnClick({R.id.tv1,R.id.tv2})

public void onClick(View view){

        switch (view.getId()) {

            case R.id.tv1 :

                Log.e("TAG", "tv1");

                break;

            case R.id.tv2 :

                Log.e("TAG", "tv2");

                break;

        }

    }

public static void injectOnClick(Activity activity) {

        Class<? extends Activity> cls = activity.getClass();

        Method[] declaredMethods = cls.getDeclaredMethods();

        if (declaredMethods == null && declaredMethods.length < 0) {

            return;

        }

        for (Method declaredMethod : declaredMethods) {

            if (declaredMethod.isAnnotationPresent(OnClick.class)) {

                OnClick onClick = declaredMethod.getAnnotation(OnClick.class);

                try {

                    int[] ids = onClick.value();

                    Object proxy = Proxy.newProxyInstance(View.OnClickListener.class.getClassLoader(), new Class[]{View.OnClickListener.class},

                            new InvocationHandler() {

                                @Override

                                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                                    return declaredMethod.invoke(activity, args);

                                }

                            });

                    for (int id : ids) {

                        View view = activity.findViewById(id);

                        Method setOnClickListener = view.getClass().getMethod("setOnClickListener", View.OnClickListener.class);

                        setOnClickListener.invoke(view, proxy);

                    }

                } catch (NoSuchMethodException e) {

                    e.printStackTrace();

                } catch (IllegalAccessException e) {

                    e.printStackTrace();

                } catch (InvocationTargetException e) {

                    e.printStackTrace();

                }

            }

        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值