Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-10-11:说说你对Java注解的理解?

MoJieBlog opened this issue · comments

em...本来想问自定义注解了,但是想了想好像没啥说的。就是重写个方法。不如让大家自由发挥下。

可以偷懒~

面试如果这样问直接懵逼, 理解就是对方法对变量进行标注,给调用的人起到提示作用,比如说过期了,不能为空,必须是id资源等等。 另外还有自定义注解,主要用于框架的编写,通过让调用者使用自己编写的注解,从而执行自己的代码逻辑。比如EventBus的接受通知消息和线程切换注解,通过这种标注,方便让框架知道当得到消息后,应该执行那个方法调用,并且在那个线程调用。

对方法对变量进行标注,给调用的人对准订阅事件提示作用,可以高效率开发。

类似标签,用于解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。主要给编译器及工具类型的软件用的。

注解,对代码进行注明。使得程序在编译或者运行时,读取到注解并加以处理,以间接的改变程序的运行。

三种注解
source
class
runtime
分别在源码,编译时,运行时存活
自定义的source注解 可以用来对 一些方法 或者参数进行约束,比如说指定线程 指定参数类型
class 注解 是配合apt 编写注解处理器, 对注解的类或者变量进行解析 生成.class文件 辅助工作 比方说 arouter,在注解处理器中生成代码 帮你做 路径和 activity的路由表,butterknife的注解帮你做findviewbyid的工作
runtime注解 则是在runtime时还能存在的 通常配合 反射机制,把注解标注的对象 拿到进行操作,比方说 retrofit,通过 反射机制 拿到注解的 接口和接口中的方法,在通过动态代理 生成接口的实现类

commented

本质:做一个标识,通过这个标识对代码规范、变量值做一些修饰。主要划分为三类

Source 仅仅存在在.java文件,编译成.class文件就消失了。作用为:让开发者按照注解的规范编写代码。例如:@OverRide  
Class 在前期编译期的流程中,会被处理成.class内容,与原生代码效率几乎相同。作用为:自动生成.class文件,做一些辅助性工作。例如:ButterKnife、GreenDao、ARouter 效率和原生代码相当
Runtime 编译成.class文件之后,依旧以注解的方式存在。而是在运行期生效。作用为:在运行期,通过反射做一些辅助性工作。例如:xUtils 由于集中使用遍历+反射,因此效率较低。而且在9.0禁用反射
commented

注解是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等。
一、注解的保留级别:
SOURCE:注解仅保留在源码级别,被编译器忽略;
CLASS:注解在编译时由编译器保留,但JVM会忽略;
RUNTIME:注解由JVM保留,运行时环境可以使用它。
二、注解的应用场景:
1、Source:APT技术,在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类。
2、Class:字节码增强,在编译出Class后,通过修改Class数据来实现修改代码逻辑的目的。可以使用注解来区分是否需要修改,或者修改为不同的逻辑。
3、Runtime:反射,在程序运行期间,通过反射技术动态获取注解与其元素,来完成不同的逻辑判定。

定义

1、注解可以理解为标签,是对代码贴上的标签。

2、元注解是可以注解到注解上的注解,能够应用到其他注解上面。元注解也是标签,是一张特殊的标签,作用是给其他普通标签进行解释说明的。元注解有@retention@documented@target@inherited@repeatable共5种。

注解的使用场景:

1、提供信息给编译器:编译器可以利用注解来探测错误和警告信息

2、编译时的处理:软件工具可以利用注解信息来生成代码、Html文档或其他处理

3、运行时的处理:可以在程序运行时接受提取