Android-自定义注解-注解基础-自定义注解

有点懵懵的

关于如何自定义interface,本来是想去找@interface的用法的定义,我去api文档里面没有发现专门介绍的部分,可能是我遗漏了。后面有发现再补上。从示例来看可以发现用法:

image

其实这样不是很好,我特别想去找关于@interface的,后面看看关键字那个桥段吧。

网上有很多文章介绍。简单示例(后面所有的示例都以Android,同时以Butterknife作为引子):

/**
 * Author:lieyun_android
 * Time:  2018/5/7 14:13
 * Des:   This is BindView[your annotation'a name] for findviewbyId.
 */
public @interface BindView {
}

再结合下元注解扩展下

理解就是说:我们这个注解目标是FIELD类型,比如View, 枚举,整型等字段声明;另外运行周期是知道运行时都存在…

/**
 * Author:lieyun_android
 * Time:  2018/5/7 14:13
 * Des:   This is BindView[your annotation'a name] for findviewbyId.
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
}

方法的我们也来一个吧

/**
 * Author:lieyun_android
 * Time:  2018/5/7 14:13
 * Des:   This is BindView for view.onclicklistenner....
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClickss {
}

这就是相对简单的自定义注解,那这个怎么使用了….这个注解目前还没有什么作用,仅仅只是声明了,我们一点点去实现效果吧。 首先看哈咋过使用!

比如控件,事件 – 基本上我们就是防butterknife的用法来的:

@BindView(R.id.xxxxx)
public TextView tv;

@OnClickss(R.id.xxx)
public void buttonClick(View view)
{

}

到这里我们基本了解定义和用法,但是这里并没什么卵用?
1.你定义@BindView(xxx)后, 谁去给tv赋值?
2.你定义了R.id.xx的OnClickss事件,这个事件的方法谁去调用???
So, 这就是我们下一步需要去做的事情 – 这就涉及到反射的知识了…!!!

Then, 我们这样定义只是简单版本,而且没有带任何参数,什么意思:这里我们@BindView(R.id.xxxx),意思其实就是想给tv赋值为ID是R.id.xxxx的控件,假使说BindView后面有人去解析它做一些事情,那如何得到这个R.id.xxxx呢?势必需要把这个R.id.xxxx作为参数传递给BindView注解,So,我们增加参数定义value:
以下都是单个参数:

/**
 * Author:lieyun_android
 * Time:  2018/5/7 14:13
 * Des:   This is BindView[your annotation'a name] for findviewbyId.
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
    ///< 资源id
    int value();
}

方法同理:

/**
 * Author:lieyun_android
 * Time:  2018/5/7 14:13
 * Des:   This is BindView for view.onclicklistenner....
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClickss {
    ///< 资源id
    int value();
}

多个参数怎么传递过去了?

/**
 * Author:lieyun_android
 * Time:  2018/5/7 14:13
 * Des:   This is BindView
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClicks {
    ///< 资源id
    int[] value();
}

基本的定义和用法就是酱紫,运行不了或者报错没有关系,别急;目前来讲我们还无法正常使用的,你什么都还没做了~~~至于value怎么被赋值(怎么被赋值这个感觉有点深,后面看看能不能看看源码,初步感觉应和@Target有关系,运行时应该是做了处理..),之后怎么获取value,怎么给tv赋值,涉及到反射,后面讲解.

还要搞清楚别的,不然萌萌的不好

int value();这里面的value可不可以改名称?当然可以,比如int viewId()/int[] viewIds(); 注解值定义如果只有一个定义的话,默认我们就用value, 这样使用时可以不用明确给变量赋值:
@BindView(value=R.id.xxxx), 这里value=可以省略;
而如果你用的默认不是value,而是viewId,那么需要:
@BindView(viewId=R.id.xxxx)

image

我亲自试验了才算明白一些事情,所以有些地方还是需要特别注意。不然使用起来一开始会出现很多问题…

贴几种多参数的定义,帮助下初识记忆

image
image

基本够用了….初识就到这里哈! 下一步我们说下反射,然后就可以实现另类版butterknife了…(butterknife并不是常规的简单反射或者动态代理,后面我们做初步分析)~~~回家休息几天!然后继续反射,这样也正好又可以总体回顾学习…

你可能感兴趣的:(Android-自定义注解-注解基础-自定义注解)