各位开发童鞋,注解这个东西我们肯定每天都能看见,也许有时候看的太多了到是会忽略注解这东西具体是如何工作的。今天在这里用最短的篇幅快速讲解下注解的原理,对这块记的不太清楚的同学也可以再次看看,下次有人详细问这块的话不至于一知半解。

元注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
@Inherited
public @interface From {
int value() default 1;
boolean canBeNull() default false;
}

把注解讲完这一个栗子就够了,可以看到自定义注解里也会有注解存在,给自定义注解使用的注解就是元注解:

  • @Rentention Rentention用来标记自定义注解的有效范围,一般就三种:RetentionPolicy.SOURCE 只在源代码中保留 一般都是用来增加代码的理解性或者帮助代码检查之类的,比如我们的Override;RetentionPolicy.CLASS 默认的选择,能把注解保留到编译后的字节码class文件中,仅仅到字节码文件中,运行时是无法得到的;RetentionPolicy.RUNTIME,注解不仅
    能保留到class字节码文件中,还能在运行通过反射获取到,一般我们真正用到的都是这种。(这个点在面试过程中有可能被问到,记性不好的赶紧收藏一下,下次要面试之前可以快速浏览一遍半个月都忘不了)。
  • @Target 说明注解使用的地方,值很多,不一一细说了
  • @Documented 使用了@Documented的可以在javadoc中找到
  • @Interited 可继承性的标识,使用了Interited表示注解里的内容可以被子类继承,比如父类中某个成员使用了上述@From(value),From中的value能给子类使用到。

关键字和注解内容

  • @interface 这个东西在声明注解的时候必须得使用,用@interface就意味着这个东西已经继承了java.lang.annotation.Annotation,也说明了它是一个注解。

然后就是注解里的内容了,上述From中定义了两项内容,所以这个注解可以这么用:@From(1),或者是@From(value = 1,canBuNull = true)或者是@From(canBuNull = true),那么能不能写成@From(true)呢。。当然不能,当括号里内容不以键值对形式出现的话默认是使用value的。

工作原理

最再说说注解的工作原理吧。也很简单,一般我们自定义的RetentionPolicy.RUNTIME比较多,就说一下它的大概原理吧,其实可以把这种注解理解成一个可以接收参数的方法,只不过这个方法的处理逻辑是别人事先写好的,使用了RetentionPolicy.RUNTIME的注解括号里提供的参数都是可以通过反射拿到,举个很简单的栗子,就拿下面来说:

From(R.id.tvLogin)
TextView tvLogin;

用这个From来接受一个id最后给tvLogin注入TextView的实例,我们在定义了这个@From注解后,再提供一个方法,在需要注入的时机调用(eg:OnCreate())

void onCreate(){
Injection.inject(this);
} class Injection{
void inject(){
int id = getIDFromReflection();//通过反射获得@From(id)中的id
TextView tv = getMemberFormReflection();//通过反射得到添加了@From注解的需要被注入的View
tv = (TextView)xxx.findViewById(id);
}
}

就这样,通过From就轻松得省去了一大堆findViewById的方法,说到底,注解最大的好处就是让代码变得简洁明了然后还能减少一些重复的机械劳动,解放双手。

其实注解就那么点东西,很简单的,平时如果使用的太多而而忽略了它的原理就有点不太靠谱了,我个人觉得做到理解了就行,很多内容全要记下来也是不可能的,只要明白了原理,太细节的地方用的时候再来查完全都不是问题了。

Java基础学习总结(46)——JAVA注解快速入门的更多相关文章

  1. Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析

    一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...

  2. java基础学习03(java基础程序设计)

    java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...

  3. java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

    最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...

  4. Java基础学习笔记一 Java介绍

    java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...

  5. JAVA基础学习——1.0 Java概述

    Java语言 SUN公司  1995年推出的高级编程语言 ■  主要应用方向 Web开发和Android开发 ■  主要特点 平台无关性:能运行于不同的平台上    安全性:去掉了指针操作,内存由操作 ...

  6. Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

    final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

  7. Java基础学习总结(50)——Java事务处理总结

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  8. Java基础学习笔记七 Java基础语法之继承和抽象类

    继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...

  9. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  10. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

随机推荐

  1. C编译时`true' undeclared (first use in this function)

    在编译C语言时有时会遇到这样的错误提示: 'true' undeclared (first use in this function) or `false' undeclared (first use ...

  2. BZOJ 2329/2209 [HNOI2011]括号修复 (splay)

    题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...

  3. python的基础及练习

    1.变量变是指变化,量是指反映某种状态例:level =1 或 2 username = ‘xuanxuan’password = ‘123’python里的“=”是赋值的意思,并不是真的等于 变量有 ...

  4. Laravel源码解析之从入口开始

    前言 提升能力的方法并非使用更多工具,而是解刨自己所使用的工具.今天我们从Laravel启动的第一步开始讲起. 入口文件 laravel是单入口框架,所有请求必将经过index.php define( ...

  5. sql where条件子句

    where中可用的运算符: where 的执行 是从右到左: where的SQL优化:(where条件特别多的情况下,效果明显) 对于and,应该尽量把假的放到右边. 对于or,应该尽量把真的放到右边 ...

  6. php $_SERVER['PHP_SELF']安全漏洞

    REQUEST_URI 返回的是包括后面数据串的地址,如 index.php?str=1234 PHP_SELF 是 index.php ------------------------------- ...

  7. Android px,dp,pt,sp的差别

    px(像素点) mm 等Android不建议用 为什么电脑web开发能够用而Android不建议用? 由于px代表像素点个数,一般电脑分辨率都同样 不管14寸还是15寸都是1366*768而手机分辨率 ...

  8. JDBC创建mysql连接池代码

    1.底层实现类(DBConnection) package JDBC.JDBCPool.MyJDBCPool; import java.sql.Connection; import java.sql. ...

  9. jQuery Mobile(jqm)button的隐藏和显示,包含a标签,圆角和非圆角button

    在移动互联网时代,HTML5开发越来越收到欢迎. 于是各种HTML5的框架都出来了.因为对于jquery的熟悉,jquery mobile 为多数人选择学习的对象.我也是众多追求者之中的一个.近期一直 ...

  10. 磁盘阵列里lun

    lun的全称是logical unit number,也就是逻辑单元号.我们知道scsi总线上可挂接的设备数量是有限的,一般为6个或者15个,我们可以用target ID(也有称为scsi id的)来 ...