JavaSE注解Annotation
1、注解概述
2、常见的Annotation示例
3、jdk内置的三个基本注解
package com.annotation.test;
import javax.sound.midi.Soundbank;
import java.util.ArrayList;
import java.util.Date;
/**
* Description:
* 1、jdk5.0新增的功能
*
* 2、Annotation的使用示例
* 示例一:生产文档相关的注解
*
* 示例二:在编译时进行格式校验检查(JDK内置的是哪个基本注解)
* @Override:限定重写父类方法,该注解只能用于方法
* @deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
* @SuppressWarnings:抑制编译器警告
*
* 示例三:跟踪代码依赖性,实现替代配置文件功能
*
* DATE: 2022/4/4 22:34
*/
public class AnnotationTest {
public static void main(String[] args) {
Person p =new Student();
p.eat();
Date date = new Date(2020,10,10);
System.out.println(date);
@SuppressWarnings("unused")
int num = 10;
@SuppressWarnings("unused")
ArrayList arrayList = new ArrayList();
}
}
class Person{
private String useName;
private String age;
public Person() {
}
public Person(String useName, String age) {
this.useName = useName;
this.age = age;
}
public void walk(){
System.out.println("走路");
}
public void eat(){
System.out.println("吃饭");
}
}
interface info{
void show();
}
class Student extends Person implements info{
@Override
public void walk() {
System.out.println("张三在走路");
}
@Override
public void eat() {
System.out.println("张三在吃饭");
}
@Override
public void show() {
System.out.println("展示详细信息");
}
}
4、spring框架中关于“事务”的管理
5、如何自定义注解
package com.annotation.test;
/**
* 1、如何自定义注解
* ①注解声明为:@interface
* ②内部定义成员,通常使用value表示
* ③可以指定成员的默认值,使用default
* ④如果自定义注解没有成员变量,表明是一个标识作用
*
* 如果注解有成员变量,在使用注解时,需要指明成员的值
* 自定义注解必须配上注解的信息处理流程(使用反射)才有意义。
* DATE: 2022/4/5 8:28
*/
@Inherited
@Documented
@Target({TYPE,METHOD,LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";
}
6、JDK元注解的使用
6.1、@Retention:指定所修饰的Annotation的生命周期
:
- SOURCE:只在源文件中保留,编译器直接丢掉
- CLASS(默认行为)
- RUNTIME只有声明为RUNTIME生命周期的注解,才能通过反射获取。
6.2、@Target({TYPE,METHOD})
用于指定被修饰的Annotation能用于修饰哪个位置的程序元素
- TYPE:用于描述可以修饰类、接口(包括注解类型)、enum
- PACKAGE:用于描述可以修饰包
- PARAMETER:用于描述可以修饰参数
- METHOD:用于描述可以修饰方法
- LOCAL_VAEIABLE:用于描述可以修饰局部变量
- CONSTRUCTOR:用于描述构造器
6.3、@Documented:所修饰的注解在被javadoc解析时会保留下来
- 使用javadoc可以生成java的说明文档。而如果在某个注解上使用了该标记,并且某个注解被用在方法、类、构造器上后,使用javadoc命令生成的说明文档是哪个说保留某个注解。
1、例如我们在方法中使用了Java.util.Date类的构造器:
2、该构造器使用了@Deprecated注解修饰。意思是这个构造器过时了
3、而该注解又被@Documented注解所修饰。那么意思是在生成的javadoc说明文档中也会将@Deprecated注解生成在说明文档上
4、javadoc:javaAPI说明文档
6.4、@Inherited表明被修饰的注解具有继承性
1、如下图所示,我的自定义注解@MyAnnotation上使用了@Inherited注解
2、我在父类Person上使用了@MyAnnotation注解
3、子类Student继承了父类Person,但上边并没有标记@MyAnnotation注解
4、下面我们通过反射证明Student类上也有@MyAnnotation注解
7、JDK8中注解的新特性
7.1、可重复注解
7.1.1、jdk8之前定义可重复注解
1、定义
2、使用
7.1.2、jdk8及以后定义可重复注解(个人觉得不太好用)
1、Annotation
- 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class;
- MyAnnotation的Target的Retention与Annotaions相同。
2、MyAnnotations注解
3、在实体类中使用
7.2、类型注解
7.2.1、@Target({ElementType.TYPE_PARAMETER}):表示被修饰的注解可以写在泛型语句中
7.2.2、@Target({TYPE_USE})表示被修饰的注解可以用在任何修饰类型的地方
如下图:@MyAnnotation注解TYPE_USER修饰
则该注解可以用在修饰类型的任何地方。