文档章节

Android中Annotation使用

似水流年0_0
 似水流年0_0
发布于 2016/05/23 15:20
字数 650
阅读 1791
收藏 48

首先创建一个项目:

这个项目很简单,就三个类,一个activity,一个注解,一个注解工具类,首先看一下activity中的代码:

package com.gefufeng.annotationdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends Activity {
	@ViewInject(value = R.id.text,defaultText = "你好注解")
	private TextView text;

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

}

这个activity非常简单,就是为了演示annotation用的,其中有一个Textview,id为R.id.text,然后我为它加上了一个自定义注解Viewinject,下面看一下这个注解:

package com.gefufeng.annotationdemo;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ViewInject {
	int value();
	String defaultText();

}

这个注解中我先简单的介绍一下几个名词:

1.@interface : 加上它ViewInject就表示一个自定义的注解

2.@Target :表示这个注解是给谁用的,是一个类的,还是一个方法呢,还是一个变量呢,等等

3.@Retention:这个注解的生命周期,有的注解在原文件中有效,有的在class文件中还有效,有的在运行时还有效

4.@Ducumented:Documented是一个标记注解,没有成员,用于描述其它类型的annotation应该被作为被标注的程序成员的公共API

OK,注解中有两个方法,就是声明了两个参数,方法的名称就是参数的名称。

下面看一下InjectUtils类:

package com.gefufeng.annotationdemo;

import java.lang.reflect.Field;

import android.app.Activity;
import android.view.View;
import android.widget.TextView;

public class InjectUtils {
	
	public static void init(Activity ac){
		Class<?> c = ac.getClass();
		Field[] fields = c.getDeclaredFields();
		for (Field f : fields) {
			ViewInject viewInject = f.getAnnotation(ViewInject.class);
			if (viewInject != null) {
				int id = viewInject.value();
				String defaultText = viewInject.defaultText();
				View view = ac.findViewById(id);
				if (view instanceof TextView) {
					((TextView)view).setText(defaultText);
				}
				f.setAccessible(true);
				try {
					f.set(ac, view);
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
	}

}

这个类也比较简单,就一个静态的init方法,用于在activity中初始化。

首先找出activity中公开的变量,然后遍历这些变量,查找哪些变量有ViewInject注解,如果有,取出value和defaultText的值,最后调用f.set(ac, view);对于field.set()方法,源码中的解释为:

Sets the value of the field in the specified object to the value. This reproduces the effect of {@code object.fieldName = value}

OK,一个注解初始化view的例子到此完成,运行这个android程序,这个textview就已被初始化,默认值为“你好注解”。

关于注解的知识这里没做系统的介绍,只是在android演示了怎么使用注解

关于反射的知识我写了一个demo: http://my.oschina.net/gef/blog/680386,可以看一下

 

 

© 著作权归作者所有

共有 人打赏支持
似水流年0_0
粉丝 55
博文 79
码字总数 51471
作品 0
长宁
高级程序员
加载中

评论(1)

pennymei
pennymei
OneAPM 详悉 Android Apps 性能信息,协助你快速定位性能瓶颈,快速捕捉性能表现差的应用代码,发现错误并随时向你发送警报,这一切只需下载并安装 OneAPM Android SDK,然后更新你的应用,就可以实现啦~可以在官网注册试用哦~
【Android】如何实现ButterKnife

如何实现ButterKnife ButterKnife的原理简述 示例代码ButterKnifeProcedure Pluggable Annotation Processing 注解处理器Java5 中叫APT(Annotation Processing Tool),在Java6开始,规范化为......

xesam
2015/06/08
0
0
「Android」Android开发你需要知道的注解(Annotation)

本文来自尚妆Android团队路飞 发表于尚妆github博客,欢迎订阅! 一、什么是注解 1、注解的作用 2、注解都有哪些 二、自定义注解 1、RetentionPolicy.SOURCE 2、RetentionPolicy.RUNTIME 3、...

尚妆产品技术刊读
2017/06/15
0
0
Kotlin 之 Annotation Processor

之前的项目中使用了 ARoute ,但是当我把标记为@Route注解的fragment文件转换成kotlin之后,运行就无法找到这个fragment了。 解决方法倒是在ARoute中写了。根据修改方法,找到了关于在kotlin中...

街角的小丑
2017/10/31
0
0
androidannotations

个人觉得,永远都要拿第一手,尽量别看国内的文章,国内写的只能做参考,用来垫脚,有基础还是看国外的文章 https://github.com/excilys/androidannotations/wiki/Download 上面是一个下载链接,里...

moz1q1
2014/12/18
0
0
Android Testing Support Library

This release includes three major updates: Espresso-Web[1]: an Espresso-like API for automated UI testing of hybrid Android applications. Use Espresso-Web to test and interact w......

jdroid
2015/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
0
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
6
2
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部