注解
一、什么是注解
注释: 注释给开发人员开的。对你的代码加以解释,程序编译后该注释不可见。
注解: 注解给程序看,该注解编译后依然存在。
@Controller @RequestMapping() ---Spring程序看的。
@Override JVM虚拟机看。重写特点。方法名要和父类被重写的方法一致,参数列表要一致,
返回值要一致。访问修饰符不能小于父类访问修饰。抛出的异常不能大于父类异常。
如果注解不被解析,那么注解就没有任何意义。
二、注解的分类
1.预定义注解:----JDK自带的一些常用注解。 2.自定义注解-----我们自己定义的注解 3.元注解:------注解上使用的注解。
1.预定义注解
@Override: 表示方法重写,只要使用了该注解必须符合重写的规则
@Deprecated: 表示已过时。告诉调用者该方法已过时
@SuppressWarnings: 表示压制警告。
@FunctionInterface: 函数式接口注解。使用该注解表明接口中只能有一个抽象方法。
package org.example.demo06;
public class Test06 {
public static void main(String[] args) {
Son s=new Son();
s.show();
s.print();
}
}
class Father{
public void print(){
System.out.println("这是father中的方法");
}
}
class Son extends Father{
@Override//检查该方法重写时是否符合重写规则
public void print() {
System.out.println("这是子类的方法");
}
@Deprecated //标记该方法过时,在调用该方法有个删除线
public void show(){
}
public void showPrefect(){
}
}
package org.example.demo03;
public class Test03 {
public static void main(String[] args) {
}
}
@FunctionalInterface //该接口中有且仅有一个抽象方法 1.8以后
interface Usb{
public void show();
}
2.自定义注解
public @Interface 注解名{//
//属性
}
package org.example.demo07;
public @interface My {
}
@My
class hello{
@My
public void show (@My int a ){
}
@My
public String name;
}
自定义的注解默认对代码没有任务影响,如果想让注解有意义,必须解析该注解。我们后面可以结合反射,来解析这些注解。
@Controller注解是因为Spring框架解析了它 @Override JVM解析了它。
三、元注解
使用在注解上的注解就是元注解。
@Target: 作用: 告诉该注解使用的范围。默认所有
TYPE,可以使用在类上 FIELD,使用在属性上 METHOD,使用方法上 PARAMETER, 使用在方法参数上 CONSTRUCTOR, 使用在构造方法上@Retention: 作用: 该注解什么时候有效。默认: SOURCE
SOURCE: 源码时有效 CLASS: 字节码时 RUNTIME: 运行时有效。【采用的最多】@Documented: 作用: 在代码生成api文档时是否存在该注解,
四、自定义注解的高级
我们可以发现我们之前使用@GetMaping注解时可以有属性值。
@interface 注解名{
数据类型 属性名();
}
数据类型可以是哪些类型?
基本数据类型, 字符串类型,枚举类型,注解类型,以及上面这些类型的数组类型。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyAnnotation { int age(); //基本类型 String name();//字符串类型 MyEnum address();//枚举 My my();//注解类型 int[] ages(); String[] names(); MyEnum[] addresss(); My[] mys(); }如果属性定义好后,在使用该注解是需要指定属性的值,
//如果属性为数组类型,给数组类型赋值时如果只有一个值那么可以省略{} //如果该注解中只使用value属性,那么value属性名可以省略。 @MyAnnotation(age=15,name="张三",address = MyEnum.BEIJING,my=@My,ages={15,25,35},names="hello") @My(value = "good",name="李四") public class Student { public void show(){ System.out.println("hello"); } }