一、Java注解
1.注解的定义
Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称为元数据)。
Java注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
2.注解与注释的区别
注解是对代码的解释和说明,其目的是提高程序代码的可读性。注解是可以被编译器打包进入class文件。
注释只存在于java源代码中,对于编译和运行没有任何作用,也不会被编译到class文件中。注释是给程序员看的,编译器与JVM都不需要知道它。
3.注解的应用
1.生成文档这是最常见的,也是java 最早提供的注解;
2.在编译时进行格式检查,如 @Override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
3.跟踪代码依赖性,实现替代配置文件功能,比较常见的是spring 2.5 开始的基于注解配置,作用就是减少配置;
4.在反射的 Class, Method, Field 等函数中,有许多于 Annotation 相关的接口,可以在反射中解析并使用 Annotation。
4.注解的分类
标准注解
1.常用的三种:
//@Override 重写的注解 @Override public String toString() { return super.toString(); } //@Deprecated 不推荐程序员使用,但是可以使用,或者存在更好的方法 @Deprecated public static void test1() { System.out.println("Deprecated"); } //@SuppressWarnings("关键字") 镇压警告(不推荐使用),将警告消除 @SuppressWarnings("all") public void test2() { List list = new ArrayList(); } public static void main(String[] args) { test1(); }
关键字 | 被抑制的警告类型 |
all | 抑制所有警告 |
deprecation | 抑制使用了过时的类或方法的警告 |
fallthrough | 抑制switch块中没有break语句的警告 |
finally | 抑制finally块中不能正常完成的警告 |
rawtypes | 抑制没有使用泛型的警告 |
serial | 抑制可序列化类没有使用序列化ID的警告 |
unchecked | 抑制未检查操作的警告 |
2.函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。(附加)
元注解
1.Target
枚举值 | 注解能够被应用的地方 |
ElementType.ANNOTATION_TYPE | 注解类型的声明 |
ElementType.CONSTRUCTOR | 构造方法的声明 |
ElementType.FIELD | 属性的声明 |
ElementType.LOCAL_VARIABLE | 局部变量的声明 |
ElementType.METHOD | 方法的声明 |
ElementType.PACKAGE | 包的声明 |
ElementType.PARAMETER | 方法参数的声明 |
ElementType.TYPE | 类,接口以及枚举的声明 |
3.Documented
4.Inherited
code:
@MyAnnotation public class test02 { @MyAnnotation public void test02() { } } //自定义一个简单的注解 //@Target 表示我们的注解可以用在哪些地方 //@Retention 表示我们的注解在什么地方有效 //@Documented 表示是否将我们的注解生成在Javadoc中 //@Inherited 表示子类可以继承父类的注解 @Target(value = {ElementType.METHOD, ElementType.TYPE}) @Retention(value = RetentionPolicy.RUNTIME) @Documented @Inherited @interface MyAnnotation{ }
自定义注解
自定义注解的格式
// 元注解 public @interface 注解名称{ // 属性列表 }
示例:
//自定义注解 public class test03 { //注解可以显示赋值, 如果没有默认值,我们就必须给注解赋值 //注解参数的顺序随意 @MyAnnotation2(age = 18, name = "jacky") public void test() { } @MyAnnotation3("jacky") public void test2() { } } @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation2{ //注解的参数: 参数类型 + 参数名 + (); String name() default ""; int age() default 0; int id() default -1; String[] schools() default {"peking university"}; } @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation3{ //如果注解参数为value赋值时可以直接写值 String value(); }