注解能方便开发者快速完成功能需求。现在大部分主流都使用注解进行开发,如Spring Boot、SSM等。
注解分为三类:预定义注解,即由JVM进行解释的注解、自定义注解,开发者根据需要自己实现的注解、元注解,定义在注解上的注解,帮助开发者完成自定义注解。
1.预定义注解:
1.1 @Override
:使用该注解的方法为重写方法,为实现类实现或重写接口规定方法的标识,重写方法必须与父类方法的方法名一致、参数一致、返回值一致、访问权限大于等于父类方法、抛出异常小于等于父类方法。
访问权限:public 、protected 、默认 、private
定义接口:
public interface InterDemo throws Exception{
//方法
public String show(String name);
}
实现方法:
public class InterDemoImpl implements InterDemo{
//重写注解
@Override
public String show(String name) throws IOException {
Date date = new Date();
return name;
}
}
1.2 @Deprecated
:该注解标识一个方法已经过时了,在调用加有该注解的方法时会在方法名上加一个中划线。
比如:
1.3 @FuncationInterface
:函数式接口,使用该注解的接口有且仅有一个抽象方法,JDK8开始加入。
@FunctionalInterface
public interface InterDemo {
public String show(String name) throws Exception;
}
如果再给接口加一个方法则会报错。
2.自定义注解
语法:public @interface 注解名{ }
public @interface MyAnnotation {
}
//类上加注解
@MyAnnotation
public class Test {
public static void main(String[]args){
Test test = new Test();
test.fan("小周");
}
//属性加注解
@MyAnnotation
private String name;
//方法加注解
@MyAnnotation
public void fan(@MyAnnotation String name){ //参数加注解
System.out.println(name + "你好~");
}
}
仅仅定义了自定义注解没有使用作用,需要结合反射来解析自定义注解赋予相应的作用。
@Override:JVM解析该注解
@Controller:Spring框架解析该注解
3.元注解
以上自定义注解可以用在类上、方法上、属性上、参数上,但实际应用上要根据实际需求限制注解的适用范围和时效。
@Retention:限制注解什么时候生效。(源码-字节码-运行)默认在字节码有效
@Target:限制注解用在哪些地方 默认可以在任意位置使用
@Documented:设定生成的api文档是否含有该注解
/**
* 自定义注解
* 元注解 注解在注解上的注解
* @Target 定义生效范围 TYPE类 METHOD方法 FIELD属性 PARAMETER参数 默认全部生效
* @Retention 定义生效时间 SOURCE源码 CLASS字节码 RUNTIME运行时 默认字节码生效
* @Documented 在生成api文档时类是否带有注解
*/
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@Retention(value = RetentionPolicy.SOURCE)
@Documented
public @interface MyAnnotation {
}
4.自定义注解(属性)
语法:
public @interface 注解名 {
数据类型 属性名() default 默认值;
//如果没有设置默认值,那么在使用该注解时必须为该属性指定值。
}
@Target(value = {ElementType.TYPE})
@Retention(value = RetentionPolicy.SOURCE)
@Documented
public @interface MyAnnotation {
String value() default "";
int age() default 18;
String[] hobby() default {};
}
如果只为 value 赋值,value 可以省略不写:
@MyAnnotation(value = "周") => @MyAnnotation("周")
如果为数组赋值,数组只有一个值那么{ }可以省略,如果有多个数值那么必须写{ }
@MyAnnotation(hobby = {"篮球","唱跳","Rap"}) => @MyAnnotation(hobby = "篮球")
@MyAnnotation(value = "周",hobby = {"篮球","唱跳","Rap"})
public class Test {
public static void main(String[]args){
Test test = new Test();
test.fan("小周");
}
private String name;
public void fan(String name){
System.out.println(name + "你好~");
}
下篇笔记:自定义注解结合反射赋予实际作用