目录
注解的理解
基本的 Annotation介绍
@Override 注解的案例
Override 使用说明
@Deprecated的说明
@SuppressWarnings 注解的案例
元注解
元注解的基本介绍
@Retention 注解
@Target
@Documented
@Inherited注解
注解的理解
1)注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
2)和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
3)在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替java EE旧版中所遗留的繁冗代码和XML配置等。
基本的 Annotation介绍
使用 Annotation 时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素
三个基本的Annotation:
1)@Override:限定某个方法,是重写父类方法,该注解只能用于方法
2).@Deprecated:用于表示某个程序元素(类,方法等)已过时
3)@SuppressWarnings:抑制编译器警告
@Override 注解的案例
@Override:限定某个方法,是重写父类方法,该注解只能用于方法
补充说明:@interface的说明 @interface不是interface,是注解类 是jdk5.0之后加入的
代码演示:
package idea.chapter11.annotation_;/*** 演示Override注解的使用*/
public class Override_ {public static void main(String[] args) {}
}class Father {//父类public void fly() {int i = 0;System.out.println("Father fly...");}public void say() {}}class Son extends Father {//子类//解读//1. @Override 注解放在fly方法上,表示子类的fly方法时重写了父类的fly//2. 这里如果没有写 @Override 还是重写了父类fly//3. 如果你写了@Override注解,编译器就会去检查该方法是否真的重写了父类的方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误//4. 看看 @Override的定义// 解读: 如果发现 @interface 表示一个 注解类 @interface表示的不是接口,表示的是一个注解类/*@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}*/@Override //说明public void fly() {System.out.println("fly");}@Override//写了Override注释后,就会去自动的检测有没有真的重写了父类的方法如果没有没有重写还是会报错的public void say() {}
}
Override 使用说明
1.@Override 表示指定重写父类的方法(从编译层面验证),如果父类没有fly方法,则会报错
2.如果不写@Override 注解,而父类仍有public void fly0t),仍然构成重写
3.@Override只能修饰方法,不能修饰其它类,包,属性等等
4.查看@Override注解源码为@Target(ElementType.METHOD),说明只能修饰方法
5.@Target是修饰注解的注解,称为元注解
@Deprecated的说明
1.用于表示某个程序元素(类,方法等)已过时
2.可以修饰方法,类,字段,包,参数 等等
3.@Target(value=(CONSTRUCTOR, FIELD, LOCAL VARIABLE, METHOD,
PACKAGE, PARAMETER, TYPE)Tatget表示,该注释可以放在哪里
4.@Deprecated的作用可以做到新旧版本的兼容和过渡
代码演示:
package idea.chapter11.annotation_;/*** 演示Deprecated注解的使用*/
public class Deprecated_ {public static void main(String[] args) {//使用了@Deprecated注解后,我们在去创建对象的时候,就会一个横线,表示的已经过时了,但是并不代表不可以使用A a = new A();//因为属性和方法都被@Deprecated注解修饰了a.hi();//使用属性也是System.out.println(a.n1);//使用方法也是//@Deprecated可以放的位置//@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})}
}//1. @Deprecated 修饰某个元素, 表示该元素已经过时
//2. 即不在推荐使用,但是仍然可以使用
//3. 查看 @Deprecated 注解类的源码
//4. 可以修饰方法,类,字段, 包, 参数 等等
//5. @Deprecated 可以做版本升级过渡使用
/*
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}*/
@Deprecated
class A {@Deprecatedpublic int n1 = 10;@Deprecatedpublic void hi() {}
}
@SuppressWarnings 注解的案例
说明各种值
1.unchecked 是忽略没有检查的警告
2.Talvtsese暴忽戰沒有指安天里的帶管(作書日沒有指定泛型的警告错误)
3.unused是忽略没有使用某个变量的警告错误
4.@SuppressWarnings可以修饰的程序元素为,查看@Target
5.生成@SupperssWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置
代码演示:
package idea.chapter11.annotation_;import java.util.ArrayList;
import java.util.List;/*** 演示@SuppressWarnings注解的使用*/
@SuppressWarnings({"rawtypes", "unchecked", "unused"})
public class SuppressWarnings_ {//1. 当我们不希望看到这些警告的时候,可以使用 SuppressWarnings注解来抑制警告信息//2. 在{""} 中,可以写入你希望抑制(不显示)警告信息//3. 可以指定的警告类型有// all,抑制所有警告// boxing,抑制与封装/拆装作业相关的警告// cast,抑制与强制转型作业相关的警告// dep-ann,抑制与淘汰注释相关的警告// deprecation,抑制与淘汰的相关警告// fallthrough,抑制与switch陈述式中遗漏break相关的警告// finally,抑制与未传回finally区块相关的警告// hiding,抑制与隐藏变数的区域变数相关的警告// incomplete-switch,抑制与switch陈述式(enum case)中遗漏项目相关的警告// javadoc,抑制与javadoc相关的警告// nls,抑制与非nls字串文字相关的警告// null,抑制与空值分析相关的警告// rawtypes,抑制与使用raw类型相关的警告// resource,抑制与使用Closeable类型的资源相关的警告// restriction,抑制与使用不建议或禁止参照相关的警告// serial,抑制与可序列化的类别遗漏serialVersionUID栏位相关的警告// static-access,抑制与静态存取不正确相关的警告// static-method,抑制与可能宣告为static的方法相关的警告// super,抑制与置换方法相关但不含super呼叫的警告// synthetic-access,抑制与内部类别的存取未最佳化相关的警告// sync-override,抑制因为置换同步方法而遗漏同步化的警告// unchecked,抑制与未检查的作业相关的警告// unqualified-field-access,抑制与栏位存取不合格相关的警告// unused,抑制与未用的程式码及停用的程式码相关的警告//4. 关于SuppressWarnings 作用范围是和你放置的位置相关// 比如 @SuppressWarnings放置在 main方法,那么抑制警告的范围就是 main// 通常我们可以放置具体的语句, 方法, 类.//5. 看看 @SuppressWarnings 源码//(1) 放置的位置就是 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE//(2) 该注解类有数组 String[] values() 设置一个数组比如 {"rawtypes", "unchecked", "unused"}/*@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings {//这里是一个 String类的数组,这也就是我们,为什么在传参的时候,传入的是一个数组的形式String[] value();}*/public static void main(String[] args) {List list = new ArrayList();list.add("jack");list.add("tom");list.add("mary");int i;System.out.println(list.get(1));}public void f1() {
// @SuppressWarnings({"rawtypes"})List list = new ArrayList();list.add("jack");list.add("tom");list.add("mary");
// @SuppressWarnings({"unused"})int i;System.out.println(list.get(1));}
}
元注解
元注解的基本介绍
(就是修饰注解的注解)
JDK的元Annotation 用于修饰其他 Annotation
元注解:本身作用不大,了解即可
1.Retention//指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
2.Target//指定注解可以在哪些地方使用
3.Documented //指定该注解是否会在javadoc体现
4.Inherited //子类会继承父类注解
@Retention 注解
说明 只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value 成员变量指定值:
@Retention的三种值
1.RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注(就是在源码的层面)
2.RetentionPolicy.CLASS:编译器将把注解记录在 class 文件中.当运行Java程序时,JVM不会保留注解。这是默认值(在使用Javac编译后的层面)
3.RetentionPolicy.RUNTIME:编译器将把注解记录在class 文件中.当运行Java程序时,JVM 会保留注解.程序可以通过反射获取该注解(在JVM加载类运行时的层面)
说明:Override的作用域在 SOURCE,当编译器编译时生效,不会写入到.class**文件**,也不会再runtime(运行时)生效
@Target
基本说明
用于修饰Annotation定义,用于指定被修饰的Annotation 能用于修饰哪 些程序元素.
@Target也包含一个名为value的成员变量。
本质上是一个数组说明了可以在那些位置生效
({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Documented
基本说明 @Documented:用于指定被该元Annotation修饰的 Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注释。 说明:定义为Documented的注解必须设置Retention值为RUNTIME。
@Inherited注解
被它修饰的 Annotation 将具有继承性.如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解 说明:实际应用中,使用较少,了解即可。 元注解:本身作用不大,讲这个原因希望同学们,看源码时,可以知道他是干什么.