新手总结,看了下别人的文章,在这里总结下,写错勿怪!
注解是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)
内置内注解全家福一张