java注解个人总结

新手总结,看了下别人的文章,在这里总结下,写错勿怪!

注解是jdk1.5后出现的新特性,跟注释不一样,注释用的是

// 单行注释
/* 多行注释 */
/** doc文档注释 */

注释一般都是给自己或别人看的,我经常用注释

注解使用的是@

@Overide
@SuppressWarnings("usuned")

注解都是用于给编译器看的
内注解,位于java.lang
元注解,位于java.lang.annotation 是修饰其他注解的注解 其他注解就是指的是内注解

元注解和内注解的区别是是:元注解不能出现在类中,内注解能出现类中,元注解决定了内注解能出现在接口中、类中等等哪些位置、还有生命周期!

内注解1 @overide (重载)

//@Target元注解修饰了@Override注解,指定@Override使用范围只能在方法里使用
@Target(ElementType.METHOD)

//@Retention元注解 修饰了@Override注解在编译时被丢弃,不会进入其他周期
@Retention(RetentionPolicy.SOURCE)

//内注解,注解类使用@interface修饰,跟定义接口差不多,加个@就是注解
public @interface Override {
}

@Overide 内注解已经被 @Target元注解修饰,只能在METHOD(方法)上使用,并且在编译后丢弃,并且该注解只能使用在重写的方法,如果在不是重写的方法上使用,那么不能通过编译
在这里插入图片描述
这里出现了2个元注解,分别是1 @Target、2 @Retention

元注解1 @Target使用ElmentType(元素类型枚举类)的常量来决定被修饰的注解能用在哪些元素中

@Target使用的常量是注解类,只能在注解类中使用

@Documented//另外一个元注解
@Retention(RetentionPolicy.RUNTIME)//编译后丢弃
@Target(ElementType.ANNOTATION_TYPE)//声明的是元注解类

public @interface Target {
    ElementType[] value();//在这里使用了数组,表示可以使用多个常量值
}

在这里插入图片描述
作用是修饰其他注解的使用范围,是只能在类、接口、枚举使用,还是在包、属性、构造方法、普通方法、局部变量、参数这些元素中使用,也可以在多个元素中使用。
(其他注解:可以理解为内注解或者自定义注解)
1.1 ElementType(元素类型) 决定了被修饰的注解能在哪些元素中使用,@Target使用属性都是该枚举类的常量,和 @Target一起使用!

在这里插入图片描述

ElementType的常量列表(自己写的,也可以去看JDK API)
在这里插入图片描述

元注解2 @Retention决定了注解的生命周期

@Retention使用RetentionPolicy(保留策略枚举类)的常量决定被修饰的注解类的生命周期

@Documented
@Retention(RetentionPolicy.RUNTIME)//使用枚举RUNTIME常量
@Target(ElementType.ANNOTATION_TYPE)//元注解类

public @interface Retention {
    RetentionPolicy value();//只能使用一个枚举常量值
}

2.1 RetentionPolicy枚举类的常量
在这里插入图片描述

在@Target和@Retention中都是使用的了RetentionPolicy的SOUCRE常量,不会进入java虚拟机,在进入java虚拟机之前就已经丢弃了!也没有记录在class字节码中

总结 @Target和@Retention都是使用了Annotaion包中的枚举常量来修饰其他的注解,它们两个本身是元注解类!

以下是两个枚举类的合影
在这里插入图片描述
@Target使用的枚举为ElementType
@Retention使用的枚举为RetentionPolicy

内注解2 @Deprecated(过时,弃用的)

@Documented

@Retention注解修饰了@Deprecated,在编译时会被丢弃。
@Retention(RetentionPolicy.RUNTIME)//生命周期

//可以在所有元素中使用
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})

public @interface Deprecated {
}

@Target注解修饰了 @Deprecated,能在所有元素类型中使用。

@Deprecated注解标识程序元素已经过时。如果一个程序元素被 @Deprecated 修饰,表示此元素已过时,编译器将不再推荐使用这个元素。并且会有删除线

在这里插入图片描述

在这里插入图片描述

内注解3 @SuppressWarnings(取消警告)

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})//修饰了@SuppressWarnings这个注解能在哪些元素中使用
@Retention(RetentionPolicy.SOURCE)//生命周期
public @interface SuppressWarnings {
    String[] value();//使用了数组,表示有多个值
}

有时候导入一个包,但是并没有使用这个包,
有时创建了一个对象的实例,但是并没有使用,
有时创建了一个局部变量,但是我并没有使用,
有时忘记关毕资源等等,
编译器都会出现警告!
老朱
老朱

@SuppressWarnings通过使用参数来取消这些警告,
在这里插入图片描述

@SuppressWarnings

在这里插入图片描述
@SuppressWarnings的value值有很多这里就写几个

 unused 表示有程序元素未被使用
 finally 无法到达该语句块
 resource 资源未关闭
 all 所有情况

如果只有一个警告时,那么不需要使用大括号
在这里插入图片描述
也可以这样 它们两个是一样的
在这里插入图片描述

总结 当@SuppressWarings只有一个成员值时(" 值")

 @SuppressWarings("unused")

@SuppressWarnings有多个成员值时( {" 值1"," 值2", " 值3 " } )

@SuppressWarnings({"unused","finally","resource"})

@Target有一个值时(ElementType.枚举元素常量)

@Target(ElementType.TYPE)
public @interface MyAnnotation {
}

@Target有多个值时({枚举常量1,枚举常量2,枚举常量3})

@Target( {TYPE, FIELD, METHOD} )
public @interface MyAnnotation {
}

@Retention只能使用CLASS RUNTIME SOURCE三个中的其中一个值

@Retention(RetentionPolicy.RUNTIME)

内置内注解全家福一张
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42754261/article/details/86388795