一、什么是注解
官方定义:
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
- 提供信息给编译器:编译器可以利用注解来探测错误和警告信息。
- 编译阶段时的处理:软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
- 运行时的处理:某些注解可以在程序运行的时候接受代码的提取
值得注意的是,注解不是代码本身的一部分。
我们通俗一点理解就是:注解就相当于超市里面商品的标签,它不属于商品,它只是为商品做一些解释说明,而注解就是为我们的代码作解释说明,并不属于我们代码本身的部分。
二、注解的使用
JDK中提供的注解*
JDK里面提供的几个注解
- @Override: java.lang.Override 是一个标记类型注解,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种注解在一个没有覆盖父类方法的方法时,java 编译器将以一个编译错误来警示。
- @Deprecated:表示该方法已经过时了。(当方法或是类上面有@Deprecated注解时,说明该方法或是类都已经过期不能再用,但不影响以前项目使用,提醒你新替代待的方法或是类。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。)
- @SuppressWarnings:表示忽略指定警告,比如@SuppressWarnings("Deprecation")
- @SafeVarargs:参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。它是在 Java 1.7 的版本中加入的。
- @FunctionalInterface:函数式接口注解,这个是 Java 1.8 版本引入的新特性。
元注解
java.lang.annotation 提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解)。
- @Retention:定义该注解的生命周期。
RetentionPolicy.SOURCE:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS:注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
- @Target:表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType 参数包括:
ElementType.CONSTRUCTOR: 用于描述构造器。
ElementType.FIELD: 成员变量、对象、属性(包括enum实例)。
ElementType.LOCAL_VARIABLE: 用于描述局部变量。
ElementType.METHOD: 用于描述方法。
ElementType.PACKAGE: 用于描述包。
ElementType.PARAMETER: 用于描述参数。
ElementType.TYPE: 用于描述类、接口(包括注解类型) 或enum声明。
- @Documented:一个简单的Annotations 标记注解,表示是否将注解信息添加在java 文档中。
- @Inherited :表示当前注解可以由子注解来继承。
- @Repeatable:是可重复的意思,Java 1.8 才加进来的,指的是注解的值可以同时取多个。
自定义注解
- Annotation型定义为@interface,所有的Annotation 会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口。
- 参数成员只能用public 或默认这两个访问权修饰,可以用default设置默认值。也可以不定义成员。
- 参数成员只能用基本类型byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组。
- 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation 对象,因为你除此之外没有别的获取注解对象的方法
注解经典运用
运行期利用反射可以获取注解:详情请移步[吃透Java基础六:反射](https://blog.csdn.net/u013277209/article/details/102782208)
注解+反射 在数据库框架方面的应用:
有一张用户表,包含id name age gender 对每一个字段进行检索并打印出Sql语句
1、自定义Table和Column注解
2、编写User类
3、利用反射获取注解信息,实现Sql语句查询
运行输出: