一、注解篇
1.1、注解的基本概念
-
注解:一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次;它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释.
要将注解(annotation)和注释(commnet)分开,注释是给人看的,机器不会执行,而注解主要是是给机器“看的”;
比如多线程中重写run()方法,会有一个
@Override
注解,该注解一是给人说明这个方式是一个重写方法,而是给机器做检查(如果你重写的方法名等不正确会报错!)注解和反射是许多java框架的底层,因此必须学好!
-
作用:
- 编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
- 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
- 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
总结:注解就是java代码的一种,可以认为是一种类型,并且主要是给机器看的
-
注解格式
@<注解名>[(参数)] # @Override # @SuppressWarning("all")
1.2、java内置注解
1.2.1、作用在代码的注解
①、@Override
-
作用: 检查该方法是否是重写方法;如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误.
-
代码演示:
package kuang.annotation.lesson1; /** * 测试Override的案例 */ public class TestOverride { @Override public String tostring() { // 重写的toString方法,这里将S改为小写会报错,因为Object中没有该方法 return "TestOverride{}"; } public static void main(String[] args) { } }
-
效果展示:
上方代码将
toString
方法的S
改为了小写,@Overside
检查后发现父类(Object类)中没有该方法,会发生编译错误
②、@Deprecated
-
作用:标记过时方法,标明该方法在该版本JDK过时或有更好的替代;如果使用该方法,会报编译警告,但不影响运行。
-
代码演示:
package kuang.annotation.lesson1; /** * 测试Deprecated的演示 */ public class TestDeprecated extends Thread { /** * 参数since,表示已注解的API元素已被弃用的版本 * 参数forRemoval,元素表示注解的API素在将来的版本中是否被删除 * 这两个参数是java9之后新增的,平时可以不用 */ @Deprecated(since = "9",forRemoval = true) // 使用废弃注解标明该方法已经不推荐使用 public static void test() { System.out.println("废弃注解测试"); } public static void main(String[] args) { test(); // 废弃方法在同一个类中,会直接标明该方法 new Thread("小明").stop(); // 通过继承等方式调用被弃用方法,会有个横线划掉方法 } }
-
效果展示
③、@SuppressWarnings
-
作用:指示编译器去忽略注解中声明的警告,可以使用参数标明镇压警告的对象,可以是构造器、方法、类等
-
代码演示:
package kuang.annotation.lesson1; /** * 测试镇压警告注解的demo */ @SuppressWarnings("all") // 使用镇压警告后,idea不会提示警告代码,并且代码在编译时,jvm也会包容警告 public class TestSuppressWarning { public static void main(String[] args) { // 未使用的变量发生警告 int a; int c; int[] array = new int[1024]; System.out.println(1 == 1.2); // 警告 } }
-
效果展示:
idea没有提示警告代码
1.2.2、元注解
元注解(meta-annotation),就是负责注解其他注解的注解,套娃滴干活
-
元注解
@Target
:用来标明注解的使用范围@Retention
:指定其所修饰的注解的保留策略,保留策略有三个:SOURCE(源码级)、CLASS(字节码级)、RUNTIME(运行时级),最用范围依次变大@Document
:该注解是一个标记注解,用于指示一个注解将被文档化@Inherited
:该注解使父类的注解能被其子类继承@Repeatable
:Java 8 开始支持,标识某注解可以在同一个声明上使用多次、@FunctionalInterface
:Java 8 开始支持,标识一个匿名函数或函数式接口@SafeVarargs
: Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
-
代码演示
package kuang.annotation.lesson1; import java.lang.annotation.*; public class TestMetaAnnotation { public static void main(String[] args) { } @Target(ElementType.METHOD) // 注解应用于方法上 @Retention(value = RetentionPolicy.RUNTIME) // 表示该注解一直到运行时有效 @Documented // 表示将注解生成在javaDoc中,不加则在javaDoc中不生成 @Inherited // 子类可以继承父类的注解 @interface myAnnotation { // 我定义的注解 } }
1.3、自定义注解
-
规范
- 使用关键字
@interface <注解名>
定义注解 - 注解体中可以包含配置参数,配置参数的形式为
<基本类型> 配置参数名()
,必须加上括号,类似一个方法 - 配置参数可以有多个,且名称自定义,可以使用
default
关键字给配置参数加上默认值 - 带配置参数的注解被引用时,参数部分必须以键值对形式写出来,有默认值的可以不写(也可以写,就是覆盖掉默认值),没有默认值的配置参数必须写上值
- 单个配置参数可以使用默认参数名
value
,该名称在注解被时引用时可以省略
- 使用关键字
-
代码演示
注解定义部分
package kuang.annotation.lesson1; import java.lang.annotation.*; /** * 注解定义: * 1.@interface关键字来定义注解 * 2.注解体中可以包含配置参数 * 3.配置参数需要有类型和配置参数名,参数类型都是基本数据类型,参数名类似方法名,需要用() * 4.自定义注解一般需要使用元注解,如@Target等来修饰,但可有可无