1.注解的概念
注释: 给人看的,便于阅读代码, 对代码的描述
注解(Annotation): 对代码的描述, 作为代码形式保留下来,
Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。
注释: 类似超市商品下面的标签, 描述商品 方便给顾客查看的
注解: 类似商品的条形码, 描述商品, 方便后期商品结算
注解的本质: 特殊的接口
声明注解: 创建了一个特殊接口
使用注解: @注解名(创建注解的一个对象)
注解的作用
1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
2、跟踪代码依赖性,实现替代配置文件功能。比如Spring的注入,未来java开发,将大量注解配置,具有很大用处; 后期学习框架大量使用, 基于注解的开发
3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出
注释: 给开发人员看的
单行注释: / /
多行注释: /**/
文档注释:在方法上 类 /** */
2.注解:给程序的spring
@GetMapping
@RequesBody
@Controller
@Override 是给Jvm程序
2.注解的种类
1.预定义注解:JDK里面自带的一些注解.该注解由JVM解析,
比如
-
@Override 检测重写
表示该方法是一个重写的方法,那么该方法必须符合重写的规则【子类重写的方法名必须和父类的方法名一致,参数也要一致,返回值也要一致 访问修饰不能小于父类
<public protected 默认 private> 抛出的异常不能大于父类】
访问修饰符也得一样,小于就或者没有就报错class F { public void show()throws Exception{ System.out.println("父类的方法"); } } class S extends F{ @Override public void show() throws Exception { super.show(); } }
大于父类抛出的异常就报错
-
@Deprecated 已过时, 只是一个标志, 还是能够使用
package com.demo.demo2; public class Demo1 { public static void main(String[] args) { S s=new S(); s.show(); } public <T>T fun(T a){ System.out.println("==="+a); return a; } } class F { public void show()throws Exception{ System.out.println("父类的方法"); } } class S extends F{ @Deprecated public void show() throws Exception { super.show(); } }
-
像Date里有提出与之对应的解决方案
- @FuncationInterface: 函数式接口.---要求接口中有且仅有一个抽象方法
3.元注解:定义在注解上的注解
jdk定义好这个注解的声明, 在注解上使用,
1.@Documented-注解是否将包含在JavaDoc中
一个简单的Annotations标记注解,表示是否将注解信息添加在javadoc文档中
2.@Retention –什么时候使用该注解
Retention 的英文意为保留期的意思。
当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间
它的取值如下:
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
自定义注解: 保留期一定设置为runtime
3.@Target–注解用于什么地方
默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括 ● ElementType.CONSTRUCTOR:用于描述构造器
● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
● ElementType.LOCAL_VARIABLE:用于描述局部变量
● ElementType.METHOD:用于描述方法
● ElementType.PACKAGE:用于描述包
● ElementType.PARAMETER:用于描述参数
● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
4.@Inherited – 定义该注释和子类的关系
Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解
多个的时候需要{ }
//自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})//My注解只能使用在类和方法上默认可以在任何位置使用,当加多个的时候,需要{}
@interface My{
}
@My //使用注解
class Hello{
@My //使用注解
private String name;
@My //使用注解
public void show(@My String a){//使用注解
System.out.println("============="+a);
}
//自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})//My注解只能使用在类和方法上默认可以在任何位置使用,当加多个的时候,需要{}
@Retention(value = RetentionPolicy.RUNTIME )//这个使用最多,运行有效
@interface My{
}
举例: @GetMaping(value="/info") 这里的value它就是注解中的属性。
语法:
public @interface 注解名{
数据类型 属性名() default 默认值;
//如果没有设置默认值,那么在使用该注解时必须为该属性指定值。
}
数据类型可以用哪些类型: 基本类型[8个] 字符串类型 上面这些类型的数组
package com.demo.a2_zhujie;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class Demo2 {
public static void main(String[] args) {
Hello h=new Hello();
h.show("你好呀");
}
}
//自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})//My注解只能使用在类和方法上默认可以在任何位置使用,当加多个的时候,需要{}
@Retention(value = RetentionPolicy.RUNTIME )//这个使用最多,运行有效 Source--->Class--->Runtime 默认在字节码生效
@interface My{
String value() default "";
int age() default 18;
String[] hobby() default {};
}
//如果只为value赋值,那么可以省略value属性名
@My(value = "hello") //使用注解
class Hello{
@My //使用注解
private String name;
@My //使用注解
public void show(@My String a){//使用注解
System.out.println("============="+a);
}
}
4.自定义注解:自己定义的注解,(默认自定义没有任何意义)使用了自定义注解并没有任何意思,要想让他有意义,必须结合后反射来解析这些注解,并赋予相应的作用。
package com.demo.demo2;
public class Demo2 {
public static void main(String[] args) {
Hello h=new Hello();
h.show("你好呀");
}
}
//自定义注解
@interface My{
}
@My //使用注解
class Hello{
@My //使用注解
private String name;
@My //使用注解
public void show(@My String a){//使用注解
System.out.println("============="+a);
}
}