全面解析java注解
为什么学习?学习的好处?学完能做什么?
- 能够读懂别人的代码,特别是框架相关的代码
- 让编程更加简洁,代码更加清晰
概念:Java提供的一种原程序中的元素关联任何信息和任何元数据的途径和方法。
学习路线:Java中的常见注解 -> 注解分类 -> 自定义注解 -> 应用实战
Java中的常见注解
a.JDK中的注解
@Override 覆盖父类或者父接口的方法
@Deprecated 表示方法已经过时
@SuppressWarnings("deprecation") 忽略方法过时警告
b.常见的第三方注解
例如Spring中的@Autowired(自动注入)
注解的分类
a.按照运行机制分
1.源码注解
注解只在源码中存在,编译成class文件就不存在了
2.编译时注解
注解在源码和class文件中都存在
eg:@Override、@Deprecated、@SuppressWarnings
3.运行时注解
在运行阶段还起作用,甚至会影响运行逻辑
eg:@Autowired
b.按照来源分
1.来自JDK的注解
2.来自第三方的注解
3.自定义注解
c.元注解:注解的注解
自定义注解
1.自定义注解的语法要求
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String desc();
String author();
int age() default 18;
}
注意:
- 使用@interface关键字定义注解
- 成员以无参无异常方式声明
- 可以用default为成员指定一个默认值
- 成员类型是受限的,合法的类型包括原始类型以及String、Class、Annotation、Enumeration
- 如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
- 注解类可以没有成员,没有成员的注解称为标识注解
2.元注解
a.@Target({ElementType.METHOD,ElementType.TYPE})
注解的作用域:
- ElementType.CONSTRUCTOR 构造方法声明
- ElementType.FIELD 字段声明
- ElementType.LOCAL_VARIABLE 局部变量声明
- ElementType.METHOD 方法声明
- ElementType.PACKAGE 包声明
- ElementType.PARAMETER 参数声明
- ElementType.TYPE 类、接口
b.@Retention(RetentionPolicy.RUNTIME)
注解的生命周期:
- RetentionPolicy.SOURCE 只在源码显示,编译时会丢弃
- RetentionPolicy.CLASS 编译时会记录到class中,运行时忽略
- RetentionPolicy.RUNTIME 运行时存在,可以通过反射读取
c.@Inherited
标识性的元注解:允许子类继承
d.@Documented
生成javadoc时会包含注解
使用自定义注解
语法:@注解名(成员1=成员值1,成员2=成员值2)
@Description(desc="I am demo",author="boy",age=18)
public void demo(){}
解析注解
概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑