注解
注释: 注释给程序员看的。方便理解该行的代码意思。
注解: 注解是给程序看的
注解的分类
(1)预定义注解
(2)自定义注解
(3)元注
预定义注解
JDK中自带的一些注解,JVM可以解析这些注解。
1. @Override: 表示方法重写的注解,如果使用该注解那么必须符合重写的规则。
2. @Deprecated: 表示过时的注解,使用该注解表示该方法已经过时了。
3. @SuppressWarnings:表示忽略警告的注解。使用该注解可以去除警告。
4. @FunctionInterface: 表示函数式接口。
package com.am.demo07;
@SuppressWarnings(value = "all")//忽略所有的警告
public class Test {
public static void main(String[] args) {
int a=15;
}
}
@FunctionalInterface //函数式接口 表示该接口中有且仅有一个抽象方法。
interface USB{
public void fun();
default void show(){
}
}
package com.am.demo07;
import java.util.Date;
/**
* @program: java高级-泛型
* @description:
* @author: 阿木
* @create: 2021-12-20 16:14
**/
public class Test07 {
public static void main(String[] args) {
Date date = new Date();
String s = date.toLocaleString();//把时间进行格式
System.out.println(s);
Info i=new Info();
i.show();
}
}
class Info {
private String name;
@Deprecated //表示该方法为过时方法,如果调用该方法会出现删除线
public void show(){
System.out.println("~~~~~~~~~~~~~~~~");
}
@Override //表示方法重写的注解。使用该注解必须保证符合重写的规则
public String toString() {
return "Info{" +
"name='" + name + '\'' +
'}';
}
}
自定义注解
如果没有人解析该注解,那么该注解没有任何意义【反射来解析该注解使其有意义】。
@Controller 那是因为Spring框架解析了该注解。
@Override: 因为JVM解析该注解。
格式:
public @interface 注解名{
注解的属性
}
public class Test08 {
}
//自定义注解
@interface MyAnnotation{}
//使用自定义的注解
@MyAnnotation
class Info{
@MyAnnotation
private String name;@MyAnnotation
public void show(){}
}
元注解
定义在注解上的注解称为元注解。
@Target: 该注解使用的位置。
//作用在类上
TYPE,//作用在属性上
FIELD,//作用在方法上
METHOD,//作用在方法参数上。
PARAMETER,//作用在构造方法上
CONSTRUCTOR,//作用在局部变量上
LOCAL_VARIABLE,//作用在注解上
ANNOTATION_TYPE,//作用在包上
PACKAGE,//类参数
TYPE_PARAMETER,/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
@Retention: 作用什么时候生效。 默认为SOURCE
SOURCE:源码上生效
ClASS:字节码上生效
RUNTIME:运行时生效----几乎都使用该值。
@Documented: 表示该注解生成API文档时是否存在。
@Inherited: 该注解是否允许被子类继承。
自定义注解时可以添加注解属性。
格式:
数据类型 属性名() default 默认值。
注意:数据类型可以是 基本数据类型 字符串 数组 枚举 注解。
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation{
int value(); //属性名为value 值为int类型
String name();//属性名为name 类型为String
double [] scores();//属性名为scores 类型为数组
My my();//自定义注解
}
@interface My{}
使用自定义的注解
@MyAnnotation(value = 18,name="刘壮",scores = {99,88,77},my=@My)
class Teacher{}
思考为什么 @RequestMaping时并没有指定method 他也不会报错。那是因为定义method属性时设置了默认值。使用default来设置。