Java基础学习总结(46)——JAVA注解快速入门
各位开发童鞋,注解这个东西我们肯定每天都能看见,也许有时候看的太多了到是会忽略注解这东西具体是如何工作的。今天在这里用最短的篇幅快速讲解下注解的原理,对这块记的不太清楚的同学也可以再次看看,下次有人详细问这块的话不至于一知半解。
元注解
@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注解快速入门的更多相关文章
- Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析
一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...
- java基础学习03(java基础程序设计)
java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...
- java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)
最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早 ...
- Java基础学习笔记一 Java介绍
java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...
- JAVA基础学习——1.0 Java概述
Java语言 SUN公司 1995年推出的高级编程语言 ■ 主要应用方向 Web开发和Android开发 ■ 主要特点 平台无关性:能运行于不同的平台上 安全性:去掉了指针操作,内存由操作 ...
- Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...
- Java基础学习总结(50)——Java事务处理总结
一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...
- Java基础学习笔记七 Java基础语法之继承和抽象类
继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...
- Java基础学习笔记八 Java基础语法之接口和多态
接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...
- Java基础学习笔记二 Java基础语法
注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...
随机推荐
- UVALive-7197 Axles 动态规划 多个背包问题
题目链接:https://cn.vjudge.net/problem/UVALive-7197 题意 需要生产n种(2<=n<=14)零件,每种零件可以用两种材料制作,对这两种材料的消耗相 ...
- 基于LXC的虚拟网络自动部署
一.问题: 在搭建以LXC为基础的虚拟网络时,网络参数繁多,配置过程繁琐.面临一个新的网络拓扑结构时,通常要花费大量时间来构建网络.因此,如果能通过配置文件,自动生成相对应的网络拓扑,并生成操作指令. ...
- Python学习笔记(5)practice:shopping_cart
2019-02-27 原代码: money = int(input("请输入金额:")) list = ["phone", "clothes" ...
- Spring中的InitializingBean接口
InitializingBean接口为bean提供了初始化方法的方式,它只有afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: impo ...
- 【codeforces 812A】Sagheer and Crossroads
[题目链接]:http://codeforces.com/contest/812/problem/A [题意] 有一个小箭头指的那个地方; 指的就是人行道路; 然后p[i]指的就是那4个人行道是不是绿 ...
- java中的接口中的方法
题目如下:(多选题)请选择以下接口定义正确的方法() A:public static void main (String[] args); B:private void test(); C:publi ...
- 纯粹的K12精髓 - 名师指导整理《20以内加法口诀表》
纯粹的K12精髓 - 名师指导整理<20以内加法口诀表> 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...
- 怎样用批处理来执行多个exe文件
怎样用批处理来运行多个exe文件 @echo off start *****.exe start *****.exe start *****.exe start *****.exe 接着我们就能够运行 ...
- [SICP] 求值规则
在Java语言学习中,通常不太关注求值规则. (2+4*6)*(3+5+7)这样的组合式的求值规则.通常归结为优先级问题: if.for等的求值规则通常归结为语义. 函数式编程语言的Scheme,将这 ...
- hdoj--3592--World Exhibition(差分约束)
World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...