抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

文章已收录Github精选,欢迎Starhttps://github.com/yehongzhi/learningSummary

什么是注解

注解是JDK1.5引入的新特性,主要用于简化代码,提高编程的效率。其实在日常开发中,注解并不少见,比如Java内置的@Override@SuppressWarnings,或者Spring提供的@Service@Controller等等,随着这些注解使用的频率越来越高,作为开发人员当真有必要深入学习一番。

Java内置的注解

先说说Java内置的三个注解,分别是:

@Override:检查当前的方法定义是否覆盖父类中的方法,如果没有覆盖,编译器就会报错。

@SuppressWarnings:忽略编译器的警告信息。

@Deprecated:用于标识该类或方法已过时,建议开发人员不要使用该类或方法。

元注解

元注解其实就是描述注解的注解。主要有四个元注解,分别是:

@Target

用于描述注解的使用范围,也就是注解可以用在什么地方,取值有:

CONSTRUCTOR:用于描述构造器。

FIELD:用于描述字段。

LOCAL_VARIABLE:用于描述局部变量。

METHOD:用于描述方法。

PACKAGE:用于描述包。

PARAMETER:用于描述参数。

TYPE:用于描述类,包括class,interface,enum。

@Retention

表示需要在什么级别保存该注释信息,用于描述注解的生命周期,取值由枚举RetentionPoicy定义。

SOURCE:在源文件中有效(即源文件保留),仅出现在源代码中,而被编译器丢弃。

CLASS:在class文件中有效(即class保留),但会被JVM丢弃。

RUNTIME:JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

如果只是做一些检查性操作,使用SOURCE,比如@Override,@SuppressWarnings。

如果要在编译时进行一些预处理操作,就用 CLASS。

如果需要获取注解的属性值,去做一些运行时的逻辑,可以使用RUNTIME。

@Documented

将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。它是一个标记注解,没有成员。

@Inherited

是一个标记注解,用来指定该注解可以被继承。使用 @Inherited 注解的 Class 类,表示这个注解可以被用于该 Class 类的子类。

自定义注解

下面实战一下,自定义一个注解@LogApi,用于方法上,当被调用时即打印日志,在控制台显示调用方传入的参数和调用返回的结果。

定义注解

首先定义注解@LogApi,在方法上使用,为了能在反射中读取注解信息,当然是设置为RUNTIME

1
2
3