注解+反射实现ViewInject的功能

23 篇文章 0 订阅
20 篇文章 0 订阅

1.反射:
获取实例:
<1>Class clazz=类名.Class
<2>实例.getClass()
<3>Class.forName(“类的全路径”)

//这是获取任意权限修饰的变量(private public protected...)
获取类中的变量:Filed filed=clazz.getDeclaredField("类中的属性名");

获取类中的所有变量:Field[] fields = clazz.getDeclaredFields();

获取类中的方法:clazz.getDeclaredMethod("该方法需要传入的值", "传入值的引用类型的实例");
                        clazz.getDeclaredMethod("kkk", String.class);
获取类中的所有方法:
Method[] declaredMethods = clazz.getDeclaredMethods();

获取注解:field.getAnnotation(ViewInject.class);//(变量名上边有注解的变量)

field.setAccessible(true);//暴力访问

☆☆重点☆☆

    <1>给变量赋值
    //给 "实例" 的 "field" 字段的值设置为 "具体值""
    field.set(实例, 具体值);

    <2>调用实例中的方法
    //调用 "实例" 的 "method" 方法,并根据 method方法的需要传入相应值,也可以接收method方法的返回值 
    method.invoke(activity, view);

注解:百度释义
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)

自定义注解:
@Target(ElementType.METHOD) // 设置适用范围为方法
@Retention(RetentionPolicy.RUNTIME) // 设置生命周期
public @interface OnClick {
int value();//用value,在使用注解的时候只需要指明具体值就行
}
下面是我仿ViewInject的依赖注入功能,在activity中省去了findViewByid的繁琐功能

自定义注解
    <1>实现点击按钮的监听事件

    @Target(ElementType.METHOD) // 设置适用范围为方法
    @Retention(RetentionPolicy.RUNTIME) // 设置生命周期
    public @interface OnClick {
        int value();
    }

    <2>实现findViewByid
    @Target(ElementType.FIELD) // 适用于成员变量
    @Retention(RetentionPolicy.RUNTIME) // 他的生命周期
    public @interface ViewInject {
        int value();
    }

    通过反射拿到相应的值

package com.lligang.viewinject_test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;

public class ViewUtils {

    public static void inject(Activity activity) {
        // 实现findViewByid的功能
        bindView(activity);
        // 实现点击按钮的功能
        bindOnclik(activity);

    }

    private static void bindView(Activity activity) {
        // 通过反射获取实例
        Class clazz = activity.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 获取我所需要的注解
            ViewInject viewInject = field.getAnnotation(ViewInject.class);
            if (viewInject != null) {
                int resId = viewInject.value();
                View view = activity.findViewById(resId);
                field.setAccessible(true);
                try {
                    // 给activity的field字段的值设置为view对象
                    field.set(clazz, view);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static void bindOnclik(final Activity activity) {
        final Class clazz = activity.getClass();
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (final Method method : declaredMethods) {

            OnClick onClick = method.getAnnotation(OnClick.class);
            if (onClick != null) {
                int resId = onClick.value();
                final View view = activity.findViewById(resId);
                view.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 通过反射调用当前用户的方法
                        method.setAccessible(true);
                        try {
                            method.invoke(activity, view);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值