Android AOP 注解详解及简单使用实例(三)
发布时间 - 2026-01-11 00:02:13 点击率:次Android 注解

相关文章:
Android AOP注解Annotation详解(一)
Android AOP之注解处理解释器详解(二)
Android AOP 注解详解及简单使用实例(三)
一、简介
在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就会提示警告
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
# AOP
# 注解
# 注解详解
# 注解使用方法
# 自定义Android注解系列教程之注解变量
# Android基于注解的6.0权限动态请求框架详解
# Android 反射注解与动态代理综合使用详解
# Android注解使用之ButterKnife 8.0详解
# Android中封装SDK时常用的注解总结
# Android AOP之注解处理解释器详解(二)
# Android AOP注解Annotation详解(一)
# Android注解框架对比分析
# Android注解ButterKnife的基本使用
# Android 中的注解详细介绍
# Android 中的注解深入探究
# 深入分析安卓(Android)中的注解
# Android注解基础介绍快速入门与解读
# 自己的
# 就会
# 使用了
# 给你
# 是这样
# 相关文章
# 希望能
# 如果没有
# 方便快捷
# 谢谢大家
# 类似于
# 就可以
# 为空
# 几件事
# 这时候
# 新建项目
# junit
# testCompile
# layout
# xx
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
网页设计与网站制作内容,怎样注册网站?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
如何自定义建站之星模板颜色并下载新样式?
如何用PHP工具快速搭建高效网站?
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel如何创建自定义Facades?(详细步骤)
详解MySQL数据库的安装与密码配置
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Laravel如何使用Livewire构建动态组件?(入门代码)
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
图册素材网站设计制作软件,图册的导出方式有几种?
手机软键盘弹出时影响布局的解决方法
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
js代码实现下拉菜单【推荐】
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Python图片处理进阶教程_Pillow滤镜与图像增强
原生JS实现图片轮播切换效果
如何在IIS中新建站点并解决端口绑定冲突?
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
创业网站制作流程,创业网站可靠吗?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
C++时间戳转换成日期时间的步骤和示例代码
南京网站制作费用,南京远驱官方网站?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何打造高效商业网站?建站目的决定转化率
如何在云主机上快速搭建网站?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
Python文件异常处理策略_健壮性说明【指导】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
实例解析Array和String方法
如何在腾讯云免费申请建站?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Laravel观察者模式如何使用_Laravel Model Observer配置
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
香港网站服务器数量如何影响SEO优化效果?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
青岛网站建设如何选择本地服务器?
如何用wdcp快速搭建高效网站?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
如何注册花生壳免费域名并搭建个人网站?
EditPlus中的正则表达式 实战(2)
JS碰撞运动实现方法详解
上一篇:老年人吃河蟹注意事项
上一篇:老年人吃河蟹注意事项

