Java注解学习笔记

#Java注解学习笔记

为什么学习注解?

  1. 能够读懂别人写的代码,特别是框架相关的代码。
  2. 让编程更加简洁,让代码更加清晰

什么是注解?
Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。

Java中的常见注解

JDK自带注解

  • @Override 用于修饰此方法覆盖了父类的方法;
  • @Deprecated 用于修饰已经过时的方法;
  • @suppressWarings(“deprecation”) 用于通知java编译器忽略特定的编译警告。

常见的第三方注解

Spring

  • @Autowired
  • @Service
  • @Repositiry

Mybatis

  • @InsertProvider
  • @UpdateProvider
  • @Options

注解的分类

按运行机制分类:

  • 源码注解 注解只在源码中存在,编译成.class文件就不存在了
  • 编译时注解 注解在源码和.class文件中都存在,如jdk自带注解
  • 运行时注解 在运行阶段还起作用,甚至会影响运行逻辑的注解,如spring的@Autowired

按照来源来分

  • JDK自带注解
  • 第三方注解
  • 自定义注解

元注解

注解的注解

自定义注解

自定义注解的语法要求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//元注解

@Target({ElementType.METHOD, ElementType.TYPE}) //Target为注解的作用域,包括CONSTRUCTOR(构造方法声明)、FIELD(字段声明)、LOCAL_VARIABLE(局部变量声明)、METHOD(方法声明)、PACKAGE(包声明)、PARAMETER(参数声明)、TYPE(类、接口)
@Retention(RetentionPolicy.RUNTIME) //Retention为注解的声明周期,包括SOURCE(只在源码显示,编译时会丢弃),CLASS(编译时会记录到class中,运行时会忽略),RUNTIME(运行时存在,可以通过反射读取)
@Inherited //标识型的元注解,表示允许子类继承
@Documented //表示生成javadoc时会包含注解信息

//使用@interface关键字定义注解
public @interface Description {
//成员类型是受限的,合法的类型包括基本数据类型及String,Class,Annotation,Enumeration
//如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
//注解类可以没有成员,没有成员的注解成为标识注解
String desc();//成员以无参无异常方式声明
String author();
int age() default 18;//可以用default为成员指定默认值

}

使用自定义注解

语法:
@<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>, … )

1
2
3
4
@Description(desc="I am human", author="wangzhe", age=18)
public String Human(){
return "woman";
}

解析注解

通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。