一、介绍
例:
public class Sun extends Father{
@Override
public String hairColor(){
return "blue";
}
@Deprecated
public String hairColorOld(){
return "blue";
}
@SuppressWarnings({"rawtypes","unused"})
public void warning(){
Map m;
}
}
1、为什么要学习注解?学完能做什么?
- 1、能够读懂别人代码,特别是框架相关的代码
- 2、让编程更加简洁,代码更清晰,自定义注解,解决问题
概念:
Java提供了一种原程序中的元素关联任何信息和任何元素的途径和方法(概念比较抽象,看不懂没关系)。
学习路径
- Java中的常见注解
- 注解的分类
- 自定义注解
- 注解的应用实例
二、Java中常见注解
JDK自带注解
Person 接口类
public interface Person {
public String name();
public int age();
@Deprecated //表示该方法过时了
public void sing();
}
Child类 实现 Person类
public class Child implements Person{
@Override //告诉编译器,覆盖父类的方法
public String name() {
return null;
}
@Override
public int age() {
return 0;
}
@Override
public void sing() {
}
}
Test 测试类
public class Test {
public void sing() {
Person p = new Child();
p.sing();
}
}
@Override:
@Deprecated:
@SuppressWarnings:
第三方注解
Spring:
@Autowired 自动装配
@Service Service层
@Repository
Mybatis:
@InsertProvider
@UpdateProvider
@Options
三、注解的分类
按照运行机制分类:
源码上注解:注解只在源码中存在,编译成.class文件就不存在了。
编译时注解:注解在源码和.class文件中都存在(例如JDK注解:
@Override
、@Deprecated
、@Suppvisewarnings
)。运行时注解:运行阶段还起作用,甚至会影响运行逻辑的注解(例如:Spirng提供的
@Autowired
注解,程序运行时,把成员变量自动注入)。
按照来源分类:
来自JDK的注解
来自第三方的注解(比如框架里的)
自定义注解
元注解:给注解进行注解
原注解示例,如下(一下为通过原注解自定义的注解Description
):
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description { //使用关键字@interface定义注解 Description
String desc(); //成员以无参无异常方式声明
String author();
int age() default 18; //用default为成员指定默认值
}
四、自定义注解
原注解详解
1、@Target({ElementType.METHOD,ElementType.TYPE})
声明自定义注解的作用域
参数有:
-
CONSTRUCTOR
(构造方法) -
FIELD
(字段声明) -
LOCAL_VARIABLE
(局部变量声明) -
METHOD
(方法声明) -
PACKAGE
(包声明) -
PARAMETER
(参数声明) -
TYPE
(类,接口)
2、 @Retention(RetentionPolicy.RUNTIME)
注解的声明周期
参数有:
-
SOURCE
(只在源码中显示,编译时丢弃) -
CLASS
(编译时会记录到class中,运行时忽略) -
RUNTIME
(运行时存在,可以通过反射读取)
3、 @Inherited
表示该注解对class使用时,可以被其子类继承
4、@Documented
表示生成javadoc是会包含注解的信息
自定义注解
自定义注解 Description
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description { //使用关键字@interface定义注解 Description
String desc(); //成员以无参无异常方式声明
String author();
int age() default 18; //用default为成员指定默认值
}
使用自定义注解
自定义注解的使用
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
示例:
@Description(desc="I am eyeColor", author="xiaowang", age=18)
public String eyeColor(){
return "red";
}