文章标题

  1. 1.
**

    Android IOC框架实现
    ===============

    ** 本文简单介绍下如何实现编译期注解

    介绍编译期注解,首先得介绍下如下两个注解

    Target注解的功能就是表明你这个注解是用在什么地方的,它的值是一个枚举型
      1.CONSTRUCTOR:用于描述构造器
        2.FIELD:用于描述域
        3.LOCAL_VARIABLE:用于描述局部变量
        4.METHOD:用于描述方法
        5.PACKAGE:用于描述包
        6.PARAMETER:用于描述参数
        7.TYPE:用于描述类、接口(包括注解类型) 或enum声明


    Retention注解的功能差不多说明的就是你的注解的生命周期吧,就是什么时候失效,它的值如下
    1.SOURCE:在源文件中有效(即源文件保留)
        2.CLASS:在class文件中有效(即class保留)
        3.RUNTIME:在运行时有效(即运行时保留)



    第一部分,实现setContentView通过注解方式实现 setContentView注解类


    package movie.select.seat.ioc; import
    java.lang.annotation.Documented; import
    java.lang.annotation.ElementType; import
    java.lang.annotation.Retention; import
    java.lang.annotation.RetentionPolicy; import
    java.lang.annotation.Target;

    /**  * Created by Administrator on 2016/11/17/017.  */ @Documented
    //表示在运行期注解 @Retention(RetentionPolicy.RUNTIME) //表示用于描述类,枚举,接口
    @Target(value=ElementType.TYPE) public @interface ContentView {
    //用于存放注解值的字段
         int value();

    }


    通过注解实现setContentView功能的方法

     public static void InjectView(Activity activity){
            if (activity!=null){
            //通过反射的方式实现注解说要实现的功能
                Class<? extends Activity> cls = activity.getClass();
               ContentView annotation= cls.getAnnotation(ContentView.class);
                int resid=annotation.value();
                activity.setContentView(resid);
                //setContentView设置完毕,即可实现findViewbyId的注解功能
                ViewInject(activity);
            }
        } 用于注解的Activity


     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            InjectUtil.InjectView(this);
            InjectUtil.ViewInject(this);
        }



    实现findViewbyId注解


    findViewbyId注解类


    package movie.select.seat.ioc; import
    java.lang.annotation.ElementType; import
    java.lang.annotation.Retention; import
    java.lang.annotation.RetentionPolicy; import
    java.lang.annotation.Target; /**  * Created by Administrator on
    2016/11/17/017.  */ @Retention(RetentionPolicy.RUNTIME) //表示用于类属性注解
    @Target(ElementType.FIELD) public @interface ViewInJect {
        int value(); }


    通过注解实现findViewbyId的功能类

     public static void ViewInject(Activity activity) {
            if (activity!=null){
                Class<? extends Activity> cls = activity.getClass();
                //通过反射的方式来获取该类中所有的属性字段
                Field[] f=cls.getFields();
                for (Field c: f){
                //遍历所有属性字段,过滤出有ViewInJect的字段
                    if (c.isAnnotationPresent(ViewInJect.class)){
                        c.setAccessible(true);
                        ViewInJect inject=c.getAnnotation(ViewInJect.class);
                        try {
                        //将通过findViewbyId获取来的View通过反射的方式赋值
                            c.set(activity,activity.findViewById(c.getAnnotation(ViewInJect.class).value()));
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
                }


            }
        }

    使用findViewbyId注解的Activity


    package movie.select.seat.ioc; import android.os.Bundle; import
    android.widget.Button; import android.widget.Toast;
    @ContentView(R.layout.activity_main) public class MainActivity
    extends BaseActivity {
        @ViewInJect(R.id.btn)
        Button btn;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            InjectUtil.InjectView(this);
            InjectUtil.ViewInject(this);
            Toast.makeText(this,btn.getText().toString(),Toast.LENGTH_LONG).show();
        } } 点击事件注解


    点击事件注解类


    package movie.select.seat.ioc; import
    java.lang.annotation.ElementType; import
    java.lang.annotation.Retention; import
    java.lang.annotation.RetentionPolicy; import
    java.lang.annotation.Target;

    /**  * Created by Administrator on 2016/11/17/017.  */
    @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)
    public @interface OnClick {
        int[] value(); }

    点击事件注解使用方法



     public static  void setClick(final Activity activity){
            Class<? extends Activity> cls = activity.getClass();
            Method[] method = cls.getMethods();
            for (final Method m :method){
                if (m.isAnnotationPresent(OnClick.class)){
                    OnClick click=m.getAnnotation(OnClick.class);
                    int[] ids=click.value();
                    for (int i : ids){
                        View view=activity.findViewById(i);
                        view.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                try {
                                    m.invoke(activity,view);
                                } catch (IllegalAccessException e) {
                                    e.printStackTrace();
                                } catch (InvocationTargetException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                    }
                }


            }

    点击事件使用Activity


     @OnClick(R.id.btn)
        public void click(View view){
            Toast.makeText(this,"1111",Toast.LENGTH_LONG).show();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值