Android AOP 注解详解及简单使用实例(三)

所属分类: 软件编程 / Android 阅读数: 32
收藏 0 赞 0 分享

Android  注解

相关文章:

Android AOP注解Annotation详解(一)
Android AOP之注解处理解释器详解(二)
Android AOP 注解详解及简单使用实例(三)

一、简介

在Android 里面 注解主要用来干这么几件事:

  1. 和编译器一起给你一些提示警告信息。
  2. 配合一些ide 可以更加方便快捷 安全有效的编写Java代码。谷歌出的support-annotations这个库 就是主要干这个的。
  3. 和反射一起 提供一些类似于spring 可配置的功能,方便简洁。

二、Support Annotations栗子

这里使用官方的一个库,说明在开发中的简单一个应用。

2.1 导包

在新建项目的时候会自动导的,可以看build.gradle中的依赖dependencies是这样的。

dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])
 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  exclude group: 'com.android.support', module: 'support-annotations'
 })
 compile 'com.android.support:appcompat-v7:25.1.1'
 testCompile 'junit:junit:4.12'
}

如果没有的话,自己在build.gradle的依赖添加(xx.x.x为你的compileSdkVersion版本号):

compile 'com.android.support:support-annotations:xx.x.x'

2.2 使用

这时候就可以使用一些support-annotations提供的注解,下面举一些栗子:

1、 @NonNull

test方法参数添加了一个NonNull注解,然后我们传递一个空的参数过去。

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  String s = null;
  test(s);
 }

 public void test(@NonNull String s){
  System.out.println(s);
 }

}

IDE就会提示警告

这里写图片描述

2、 @StringRes

再定义testString方法参数添加了一个StringRes注解,然后我们传递一个数字过去。

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  testString(112312);
  testString(R.string.app_name);
 }

 public void testString(@StringRes int s){
  System.out.println(s);
 }

}

IDE就会提示

这里写图片描述

三、实现自己的ButterKnife

经过之前的知识,我们已经知道注解的原理和使用了,这里实现ButterKnife的一个简单功能,View的注入: 一个注解,一个解析器即可。

3.1 BindView注解

@Target(ElementType.FIELD) //解析常量
@Retention(RetentionPolicy.RUNTIME) //运行时
public @interface BindView {
  int value() default -1; //标识控件
}

3.2 BindViewParser解析器

/**
 * Created by Litp on 2017/2/17.
 */
public class BindViewParser {

 /**
  * 传递activty或者View 对象,使用反射获取view变量
  * @param object
  */
 public static void inject(Object object) {

  try {
   parse(object);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 解析获取值
  * @param object
  * @throws Exception
  */
 public static void parse(Object object) throws Exception {

  final Class<?> clazz = object.getClass();

  View view = null;

  //获取clazz的变量,不论private还是public
  Field[] fields = clazz.getDeclaredFields();

  for (Field field : fields) {

   //这个变量 是否有BindView注解
   if (field.isAnnotationPresent(BindView.class)) {
    //获取这个变量对应的注解
    BindView injectView = field.getAnnotation(BindView.class);
    //获取值
    int id = injectView.value();
    if (id <= 0) {
     throw new Exception("View的id不能为空");
    } else {
     //设置可以访问
     field.setAccessible(true);
     //获取view
     if (object instanceof View) {
      view = ((View) object).findViewById(id);
     } else if (object instanceof Activity) {
      view = ((Activity) object).findViewById(id);
     }
     //设置View
     field.set(object, view);
    }

   }

  }

 }


}

3.3 Activity使用

public class MainActivity extends AppCompatActivity {

 //使用注解标识变量
 @BindView(R.id.tv_test)
 TextView textView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  //传递当前activty给解析器,进行初始化view
  BindViewParser.inject(this);

  //这里就已经是初始化完毕了,可以进行使用了
  textView.setText("测试自己的注入demo");

 }


}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

android byte[] 和short[]转换的方法代码

这篇文章主要介绍了android byte[] 和short[]转换的方法代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android获取应用程序大小的方法

这篇文章主要介绍了Android获取应用程序大小的方法,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android获取其他包的Context实例代码

这篇文章主要介绍了Android获取其他包的Context实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android放大镜的实现代码

这篇文章主要介绍了Android放大镜的实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android 读取Properties配置文件的小例子

这篇文章主要介绍了Android 读取Properties配置文件的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android通讯录开发之删除功能的实现方法

这篇文章主要介绍了Android通讯录开发之删除功能的实现方法,有需要的朋友可以参考一下
收藏 0 赞 0 分享

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享
查看更多