博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中注解的使用
阅读量:5256 次
发布时间:2019-06-14

本文共 3553 字,大约阅读时间需要 11 分钟。

      如果你是一名安卓开发者,你也一定听过大名鼎鼎的网络请求框架Retrofit。它将网络请求的方式以注解的形式展现,极大的提高了代码的可读性,同时网络请求集中写在一个interface中提高了代码的可维护性。除此之外,例如Dagger , GreenDao,ButterKnife等等 也是大量运营了注解。为什么这些知名的开源项目如此青睐注解?

       在注解使用之前,xml被广泛用于描述原数据,但是在使用xml越来越长之后,开发人员意识到使用xml耦合性太高。于是在java 5.0 的版本,注解(Annotation)出现了。目前xml 与 Annotation 共同使用着,发挥着他们的长处。我们该如何使用注解呢?其实注解使用起来非常简单。一个自定义注解可以被四个java 规定的原注解所描述这四个原注解分别是:@Documented   @Retention  @Target  @Inherited 。

 

 @Documented -表示是否将注解信息添加在java文档中。

 

 @Retention -定义该注解的生命周期。

 RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。

 RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。

 RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

 

 @Target -表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,

仅仅排除一个属性,那么你需要在定义target包含所有的属性。

 ElementType.TYPE:用于描述类、接口或enum声明

 ElementType.FIELD:用于描述实例变量
 ElementType.METHOD
 ElementType.PARAMETER
 ElementType.CONSTRUCTOR
 ElementType.LOCAL_VARIABLE
 ElementType.ANNOTATION_TYPE 另一个注释
 ElementType.PACKAGE 用于记录java文件的package信息

 

 @Inherited  -定义该注释和子类的关系

 

        话不多说我们来实战一下。在我们开始写项目的时候通常都会封装一个BaseActivity,每个面向界面的Activity中都会指向一个xml 界面文件,也就是Activity 与 xml是绑定关系的。这样我们的注解就能派上用场了,我们可以通过注解将xml 绑定到对应的Activity中。一个Activity类中绑定一个layout 那么我们的注解描述类型就是TYPE。这个绑定效果一定是作用到运行时的,所以有了如下代码。

1 @Retention(RetentionPolicy.RUNTIME)2 @Target(ElementType.TYPE)3 @Documented4 public @interface BindLayout {5     @LayoutRes6     int value();7 8 }

         我们通过反射获取到这个注解中传入的xml数据,将他绑定在Activity中。代码如下:

1 private static void bindActivityLayout(Activity activity) {2         Class aClass = activity.getClass();3         BindLayout annotation = (BindLayout) aClass.getAnnotation(BindLayout.class);4         if (annotation != null) {5             activity.setContentView(annotation.value());6             ButterKnife.bind(activity);7         }8     }

        我们只要在Activity中的OnCreate初始化一下,就能够轻松实现绑定。

@BindLayout(R.layout.activity_xx)public class XXActivity extends Activity {@Override    protected void onCreate() {        MoBind moBind = new MoBind();        moBind.bindActivity(this);    }...}

       比较正确的做法是将绑定方法放入BaseActivity中,让我们的子类继承于他,这样一对一的关系变的简洁明了。当然,不只只是这样,你可以开发新的用途,例如,我们需要在界面中绑定其他View做一下操作,比如显示一个空的界面或者显示一个自定义的Dialog。

通过注解,也可以快速的绑定,还记得我们的原注解Targe可以修饰一个变量,于是绑定一个其他View在Activity中就可以这么做:

1 @Retention(RetentionPolicy.RUNTIME)2 @Target(ElementType.FIELD)3 @Documented4 public @interface BindOthersView {5     @LayoutRes int value();6 }

      我们一样通过反射调用:

1 private static void bindActivityView(Activity activity) { 2         Field[] declaredFields = activity.getClass().getDeclaredFields(); 3         if (declaredFields != null && declaredFields.length > 0) { 4             for (Field f : declaredFields) { 5                 BindOthersView annotation = f.getAnnotation(BindOthersView.class); 6                 if (annotation != null) { 7                     View inflate = LayoutInflater.from(activity).inflate(annotation.value(), null); 8                     if (inflate != null) { 9                         try {10                             f.setAccessible(true);11                             f.set(activity, inflate);12                         } catch (IllegalAccessException e) {13                             e.printStackTrace();14                         }15                     }16                 }17             }18         }19 20     }

     我们只需要在BaseActivity中的OnCreate 中初始化一次,就可以在它的子类中随意绑定其他View(代码中已经做了初始化,请放心使用)。

 1 @BindOthersView(R.layout.empty_view)

2  View emptyView; 

     怎么样,实现起来是不是非常简单,总结起来就是三个步骤,定义注解,解析注解,使用注解。快去定义你自己的注解,让你的代码变得简洁且逼格满满吧。

转载于:https://www.cnblogs.com/lovelyYakir/p/9341954.html

你可能感兴趣的文章
springdata框架
查看>>
log4j在java项目中使用
查看>>
坐标转换
查看>>
8.String to Integer (atoi) (INT; Overflow)
查看>>
hdu 1002 A + B Problem II
查看>>
leetcode Search a 2D Matrix II
查看>>
VMware下centos6.3minimal搭建网络环境
查看>>
POJ 3087 Shuffle'm Up(洗牌)
查看>>
linux 基础001
查看>>
my english dream
查看>>
无向图广度优先遍历及其JAVA实现
查看>>
36-Python3 多线程
查看>>
C++面向对象类的书写相关细节梳理
查看>>
The game of Fort/Da是自虐还是自保?
查看>>
csharp: Aspose.Words create table
查看>>
项目心得。
查看>>
哈夫曼算法(haffman)实现压缩和解压缩-C语言实现
查看>>
Adam Optimizor
查看>>
WebLogic Server StuckThreadMaxTime value is exceeded during configuration
查看>>
asp.net中的数据绑定表达式
查看>>