Android AOP之路三 Android上的注解
一、简单介绍
啥是注解。不懂的能够先看我上一篇文章。
在android 里面 注解主要用来干这么几件事:
和编译器一起给你一些提示警告信息。
配合一些ide 能够更加方便快捷 安全有效的编写java代码。
谷歌出的support-annotations这个库 就是主要干这个的。
和反射一起 提供一些相似于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就会提示警告
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbml1Yml0aWFucGluZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">
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();
最新文章
- struct 大小计算
- zedboard如何从PL端控制DDR读写(六)
- springMVC+MyBatis+Spring+maven 整合(1)
- initrd.gz的解压和制作
- Android 连接 SQL Server (jtds方式)——上
- linux中的cd ..和cd -命令有什么区别?
- 动态绑定Gridview带模板列
- Windows Phone开发(22):启动器与选择器之BingMapsDirectionsTask
- .8-Vue源码之AST(4)
- yield next和yield* next的区别
- Jumpstart for Oracle Service Bus Development
- Objective-C 是如何慢慢走红的?
- [转][SqlServer]收缩日志
- Java Core - 创建对象的两种方式
- linux中make的有关规则的特性
- oo作业总结(四)
- ADO.NET 【属性扩展】性别、年龄、编号
- 我来科普一下为毛很多人升级了20M的电信光纤宽带反而感觉速度更卡了
- Django单元测试简单示例
- Windows Azure Mobiles Services实现client的登录注冊