注解
1注解的概念
1 注解的引入
为什么需要学习注解?
1.能够看懂别人写的一些代码,最后好能够看懂一写框架代码
2.注解结合反射和泛型能够将代码写的更加灵活,更加动态,更加简洁,提高了代码扩展性和可维护性
3.能够使用自定义注解解决开发中的一些问题
2注解的概述
Java提供了一种源程序中的元素和任何信息或者元数据相关联的方法或者渠道
源程序中元素: Java文件 构造方法、成员变量、成员方法…
任何信息: 就是解释说明,可以理解为注释,但是和注释又不同,注释只能够在源码中存在,程序运行的时候,不会被解释执行,注解可以作用在不仅是源码上,还可以作用在编译时期以及运行时期,特别是在运行时期, 能够通过反射获取到这些信息,根据这些信息能够动态地改变程序的逻辑,从而提高代码的扩展性和可维护性,就是一些配置数据
元数据: 就是元注解,对注解进行注解,可以理解为满足某种结构的数据 key = value
关联: 注解和元素绑定的手段
简单来说: 就是相当于一些类似于注释的信息 和 源程序中的元素 绑定的一种技术,这种技术叫做注解, 这种手段可以通过反射获取到元素对象,在获取到这个元素上面绑定的注解,通过绑定的注解获取里面配置信息, 从而达到能够在程序运行阶段通过这些信息动态地改变程序的运行逻辑
Java常见的一些注解:
@Override: 表示该注解修饰的方法必须满足重写的规则,否则编译报错,该注解由编译器提取识别
@Deprecated: 表示成员过时,编译器会在程序运行(编译时/源码是)的时候获取到成员变量,
提取类中的成员上是否存在@Deprecated这个注解,如果存在,编译器就会添加删除线
@SuppressWarnings: 表示忽略警告,我们可以通过这个注解消除黄色警告线,但是并没有去除安全隐患
@FunctionInterface: 表示当前接口是一个函数式接口
函数式接口: 当一个接口中只有一个抽象方法的时候成为函数式接口
3注解的分类:
按照运行机制分类
1源码注解: 注解只在源码有效,当编译器编译生成字节码文件的时候,该注解就不存在,其实就是和 注释一模一样
2编译时注解: 该注解在源码和编译时期有效,在JVM执行的过程中,该注解就不存在了
3运行时注解: 该注解在源码和编译时甚至运行时有效,在程序执行过程开发者还可以获取到该注解,同时获取到注解上的元数据,从而动态地改变程序的运行逻辑以及执行结果
4元注解: 对注解进行注解的注解
按照来源分类
JDK中自带的注解: @Override,@Deprecated
第三方注解: @Table,@Column,@Component,@Service,@Bean
自定义注解: 自己定义注解自己使用在自己的代码中
元注解: 对注解进行注解的注解
// 这是注解测试类
public class AnnotationDemo01 {
// desc="主方法", method="main", arguments=args
public static void main(String[] args) {
}
}
class Fu {
@SuppressWarnings("unused")
public void method() {
// @SuppressWarnings("unused")
int a;
}
}
@Deprecated
class Zi extends Fu{
@Override
@Deprecated
public void method() {
super.method();
}
}
@FunctionalInterface
interface Inter{
void show();
// void method();
}
2注解的基本语法
1注解语法
1.注解是由@interface来修饰
2.注解也是有成员的,但是这里的成员类似于成员方法,但是又要理解为成员变量
注意: 这里的成员本质是属性,可以理解为成员变量,成员变量不能够抛出异常,也不能有参数
3.成员可以是常量,也可以有变量
4.注解成员的数据类型
only primitive type, String, Class, annotation,
enumeration are permitted or 1-dimensional arrays thereof
八大基本类型 String Class 注解 枚举 一维数组
5.注解的默认值格式: int age() default 18;
6.如果一个注解没有任何成员,表示标记注解
7.有一个默认的规范,如果一个注解只有一个成员,那么该注解的成员一般叫做value
2元注解
通过学习元注解来学习注解的语法
JDK中非常重要的四个元注解:
@Target: 该元注解所标识的注解能够作用在什么元素(元素的参考范围可以参考 ElementType枚举类)
@Retention: 该元注解所标识的注解的生命周期 (生命周期参考范围参考RetentionPolicy枚举类)
@Inherited: 该元注解所标识的注解可以被继承
public class AnnotationDemo02 {
}
@interface Table {
String name() default "隔壁老王";
int age() default 18;
final int num = 100;
// List<String> list();
Class<String> c();
Override override();
ElementType type();
int[] arr();
// double[][] arr2();
}
@interface Column {
String value();
}
3注解的使用
注解的使用
四种格式:
格式一: @注解名称(属性名称1=属性的值1,属性名称2=属性的值2,属性名称3=属性的值3,…,属性名称n=属性的值n)
注意: 有多少个属性就写多少个
格式二: @注解名称(属性的值1)
注意: 适用于只有一个属性的情况
格式三: @注解名称({属性的值1,属性的值2,属性的值3,…,属性的值n})
注意: 适用于属性类型是数组的情况
格式四: @注解名称
注意: 适用于是标记注解的情况
public class AnnotationDemo03 {
}
@MyAnnotation(name = "张三", age = 22)
class Person {
}
class Student extends Person{
@MyAnnotation(name = "张三", age =