Android开源框架-Annotation框架(以ViewMapping注解为例)
Annotation 分类
1 标准 Annotation
包括Override, Deprecated, SuppressWarnings,标准 Annotation 是指 Java 自带的几个 Annotation,上面三个分别表示重写函数,函数已经被禁止使用,忽略某项 Warning
2 元 Annotation
@Retention, @Target, @Inherited, @Documented,元 Annotation 是指用来定义 Annotation 的 Annotation,在后面 Annotation 自定义部分会详细介绍含义
3 自定义 Annotation
自定义 Annotation 表示自己根据需要定义的 Annotation,定义时需要用到上面的元 Annotation 这里只是一种分类而已,也可以根据作用域分为源码时、编译时、运行时 Annotation,后面在自定义 Annotation 时会具体介绍
1.Java.lang包中常用的注解有@Override,@Deprected(已经废弃),@SupressWarning(屏蔽掉一些警告。)我们可以自定义注解。
2.Java注解之@Retention,@Documented,@Inherited.
- Retention注解,保留注解说明,这种类型的猪儿会被保留到哪个阶段,有三个值:RetentionPolicy.SOURCE(只有源码级别保留,编译时被忽略),RetentionPolicy.CLASS(class文件中保留,Jvm被忽略),RetentionPolicy.RUNTIME(Jvm保留,所以他们能在运行时被Jvm或者其他运用反射机制的代码所读取和使用)。
- Document注解,目的就是将这一Annotation的信息显示在JavaAPI文档上,如果吗没有这个注解,在API文档上就不显示Annotation信息。这个注解应该被Javadoc工具记录,javadoc工具在默认情况下不包括注解,如果被注解,会被javadoc之类的工具处理,注解类型的信息也会被包括在生成的文档中。
- Inherited注解,子类的父类被标记为@Inherited,子类将自动继承父类的所有属性,除了要实现父类接口方法,还要事项Object类中的方法及annotationType()。
3.java中注解主要的功能是:让开发更易,开发和部署工具可以以某种方式阅读并处理他们。包含注解的程序可以替代额外的Java源文件,XML文件或错误检测机制。
4.Java中注解的目的是:花更少得 时间在哪些死硬无用的细节中,更多的关注业务逻辑。利用注解可以明显的减少代码量,使得代码的结构清晰。
5.Java中的反射机制:是Java被视为动态(或者准动态)语言的一个关键性质,这个机制允许程序在运行是通过jdk给出的reflectionAPIs获取任何一个已知名称的class内部信息,包括其modifier(诸如:public,static等),superclass(例如:object),实现interface(例如:cloneable),也包括fileds和methods所有信息,并可以运行改变fields和methods。Java可以加载一个运行时才得知名称的class,获取其完整的结构。
6.反射机制的功能:获取类的class对象,获取类的fields,获取类的method,获取类的constructor,新建类的实例函数(class<T>的函数newInstance)。
7.Target里面的ElementType是用来指定Annotation类型可以用在哪些元素上的。例如:TYPE(类型),FIELD(属性),METHOD(方法),PARAMETER(参数),CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量),PACKAGE(包)。其中TYPE类型是指可以用在class,interface,enum,Annotatin类型上。
下面我们来看一下Android中的ViewMapping注解:
从上图我们可以看到,在这个注解上面有定义该注解的保留阶段是在Jvm。可以用在类型和属性上面。
其中定义部分的id()(方法)表示注解接收一个int类型的数据作为id所对应的值(id=R.id.xx)。注解类型不能new对象,viewMapping对象从何而来,Java反射机制,每个继承object类都有getClass方法。通过获取注解类的class,再获取其中的id,然后就可以获取id对应的控件。
Android客户端用注解来实现findViewById功能及setContentView功能,在Androidplus.jar中的util中有如下代码实现。
package com.androidplus.util; import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.lang.reflect.Field; public class ViewMappingUtil
{
public static View mapView(Object object, Activity activity)
{
Context context = activity;
ViewMapping viewMapping = (ViewMapping)object.getClass().getAnnotation(ViewMapping.class);
View rootView = ((LayoutInflater)context.getSystemService("layout_inflater")).inflate(viewMapping.id(), null);
activity.setContentView(rootView);
mapView(object, rootView);
return rootView;
} public static void mapView(Object object, View rootView) {
startReflect(object, rootView, object.getClass());
} public static void mapView(Object object, View rootView, int layer) {
startReflect(object, rootView, object.getClass());
Class clazz = object.getClass().getSuperclass();
for (int i = ; i < layer - ; ) {
startReflect(object, rootView, clazz); ++i; clazz = clazz.getSuperclass();
}
} private static void startReflect(Object object, View rootView, Class<?> clazz)
{
Field[] fields = clazz.getDeclaredFields(); Field[] arr$ = fields; int len$ = arr$.length; for (int i$ = ; i$ < len$; ++i$) { Field field = arr$[i$];
ViewMapping viewMapping = (ViewMapping)field.getAnnotation(ViewMapping.class);
int id = ;
if (viewMapping != null)
try {
id = viewMapping.id();
field.setAccessible(true);
field.set(object, rootView.findViewById(id));
} catch (Exception e) {
throw new RuntimeException(id + " map error!");
}
}
} public static View mapView(Object object, Context context)
{
return mapView(object, context, null, false);
} public static View mapView(Object object, Context context, ViewGroup parent, boolean isAttach) {
ViewMapping viewMapping = (ViewMapping)object.getClass().getAnnotation(ViewMapping.class);
View rootView = ((LayoutInflater)context.getSystemService("layout_inflater")).inflate(viewMapping.id(), parent, isAttach); mapView(object, rootView);
return rootView;
}
}
Android开源框架-Annotation框架(以ViewMapping注解为例)的更多相关文章
- android开源项目和框架(转)
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github.c ...
- android开源项目和框架
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github.c ...
- 【转】android开源项目和框架
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github ...
- 值得推荐的android开源框架
1.volley 项目地址https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(scheduling) ...
- 6个值得推荐的Android开源框架简介(转)
虽然我们在做app的时候并不一定用到框架,但是一些好框架的思想是非常有学习价值的 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo ...
- android开源框架
1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(scheduli ...
- android 开源框架推荐
同事整理的 android 开源框架,个个都堪称经典.32 个赞! 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JS ...
- 常用Android开源框架
1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,异步下载图片: (2) 网络请求的排序(scheduli ...
- 六款值得推荐的Android开源框架简介
技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的“性价比”比较高的Android开源框架,应该是相对实用的. 1.volley 项目地址 https://github.com/smanik ...
随机推荐
- Saltstack 命令行:批量发送命令,返回执行结果
批量发送发送命令符,并返回结果. salt '*' cmd.run 'df -h' ---------------------------------------- Stest1: Filesyste ...
- 《Python学习手册》(三)
string 字符串,和列表.元组,都适用序列操作. 关于python转义字符 迭代 for x in S: print(x) [c * 2 for c in S] Comparasion: > ...
- float 为什么可以表示很大的整数
1.float型:单精度浮点数在机内占4个字节,用32位二进制描述(注意:计算机中1个字节=8位). 2.浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分. 3.可以算出float型 ...
- python_初步
官网地址:http://www.python.org/ Python最新源码,二进制文档,新闻资讯 Python文档下载地址:www.python.org/doc/ python教程:http://w ...
- MySql判断汉字、日期、数字的具体函数
几个平常用的mysql函数,MySql判断汉字.日期.数字的具体函数分享给大家,具体内容如下 1.判断字符串是否为汉字 返回值:1-汉字 0-非汉字 ? 1 2 3 4 5 6 7 8 9 10 11 ...
- 使用js写的确认提交表单确认框
js脚本 <script language="Javascript"> function validator() { if(confirm("确认要执行此操作 ...
- Android解决软键盘弹出将布局顶到上面
有时候我们在下面的布局是一个RadioGroup,然后当页面中的EditText获得焦点的时候,会将地步的RadioGroup顶起来,这时候我们只需要在AndroidMainfest中RadioGro ...
- Spark- SparkSQL中 Row.getLong 出现NullPointerException错误的处理方法
在SparkSQL中获取Row的值,而且Row的字段允许null时,在取值的时候取到null赋值给新的变量名会报NullPointerException错误, 可以先用row.isNullAt(ind ...
- C语言中链接影响程序的细节
参考:<深入理解计算机系统> 7.61节 链接器如何解析多重定义的全局符号 基本的原则是这样的:对于所有的全局符号,函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号. Un ...
- Django进阶Model篇002 - 模型类的定义
一.创建数据模型. 实例: 作者模型:一个作者有姓名. 作者详情模型:把作者的详情放到详情表,包含性别.email 地址和出生日期,作者详情模型与作者模型之间是一对一的关系(OneToOneField ...