介绍
今天就跟大家聊聊有关如何在Android中使用AOP注解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
<强>一、简介强>
在安卓里面注解主要用来干这么几件事:
- <李>
和编译器一起给你一些提示警告信息。
李> <李>配合一些ide可以更加方便快捷安全有效的编写Java代码。谷歌出的support-annotations这个库就是主要干这个的。
李> <李>和反射一起提供一些类似于弹簧可配置的功能,方便简洁。
李><强>二,支持注释栗子强>
这里使用官方的一个库,说明在开发中的简单一个应用。
2.1导包
在新建项目的时候会自动导的,可以看。gradle中的依赖依赖性是这样的。
dependencies { ,compile fileTree (dir: & # 39;填词# 39;,,包括:,(& # 39;* . jar # 39;]) ,androidTestCompile (& # 39; com.android.support.test.espresso: espresso-core: 2.2.2 # 39;,, { ,,exclude 组:& # 39;com.android.support& # 39;,,模块:,& # 39;support-annotations& # 39; ,}) ,compile & # 39; com.android.support: appcompat-v7:25.1.1& # 39; ,testCompile & # 39; junit: junit: 4.12 & # 39; }
如果没有的话,自己在build.gradle的依赖添加(xx.x.x为你的compileSdkVersion版本号):
compile & # 39; com.android.support: support-annotations: xx.x.x& # 39;
2.2使用
这时候就可以使用一些support-annotations提供的注,解下面举一些栗子:
1, @NonNull
测试方法参数添加了一个null注解,然后我们传递一个空的参数过去。
public class MainActivity extends AppCompatActivity { ,@Override ,protected void  onCreate (Bundle savedInstanceState), { super.onCreate才能(savedInstanceState); ,,setContentView (R.layout.activity_main); String 才能;s =,空; 测试才能(年代); ,} ,public void 测试(@NonNull String s) { System.out.println才能(年代); ,} }
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才能(年代); ,} }
IDE就会提示
<强>三,实现自己的ButterKnife 强>
经过之前的知识,我们已经知道注解的原理和使用了,这里实现ButterKnife的一个简单功能,视图的注入:一个注解,一个解析器即可。
3.1 BindView注解
@Target (ElementType.FIELD),//解析常量 @Retention (RetentionPolicy.RUNTIME),//运行时 public @interface  BindView { int 才能;价值(),default 1;,//标识控件 }
3.2 BindViewParser解析器
/* * ,* Created by  Litp 提醒2017/2/17。 ,*/public class  BindViewParser {/* * *,才能传递den或者View 对象,使用反射获取视图变量 *,才能@param 对象 ,*/,public static  void 注入(Object 对象),{ try {才能 ,才能解析(对象); ,,},catch (Exception e), { ,,e.printStackTrace (); ,,} ,}/* * *,才能解析获取值 *,才能@param 对象 *,才能@throws 例外 ,*/,public static  void 解析(Object 对象),throws Exception { final 才能;Class< ?祝辞,clazz =, object.getClass (); View 才能;View =,空;//才能获取clazz的变量,不论私人还是公开的 场[],才能fields =, clazz.getDeclaredFields (); for 才能;(Field Field :字段),{ ,,//这个变量,是否有BindView注解 ,,if (field.isAnnotationPresent (BindView.class)), { ,,,//获取这个变量对应的注解 ,,,BindView injectView =, field.getAnnotation (BindView.class); ,,,//获取值 ,,,int id =, injectView.value (); ,,,if (id & lt;=, 0), { ,,,,throw new 例外(“视图的id不能为空“); ,,,},{else ,,,,//设置可以访问 ,,,,field.setAccessible(真正的); ,,,,//获取视图 ,,,,if (object instanceof 视图),{ ,,,,,view =,((视图),对象).findViewById (id); ,,,,},else if (object instanceof 活动),{ null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null如何在Android中使用AOP注解