这是我参加【第四届青训营】笔记创作活动的第2天
Java注解
Java注释用来将任何的信息或元数据与程序元素(类,方法和成员变量等)进行关联。被认为是安全的类似注释的机制,不会影响程序的业务逻辑,就像提供一种信息标识。经常在一些框架使用的时候出现。
注解定义
Java注解定义与Java的接口定义类似,定义一个Java注解TestAnontation:
public @interface TestAnontation{
}
复制代码
Java接口定义只需要将interface前面的@符号去掉即可。
注解使用
Java注解是用来将信息或元数据与程序元素(类,方法和成员变量等)进行关联的,使用的时候将需要注解的程序元素按如下格式进行关联,
@TestAnontation
public void Myclass{
}
复制代码
这是对Java类进行注解,以同样的方式可以对方法和成员变量进行注解。直接在需要添加注解的程序元素上添加“@注解名”
元注解
元注解被定义为可以注解到注解之上的注解。一共有5种元注解@Retention、@Documented、@Target、@Inherited以及@Repeatbable
@Retenttion
@Retention注解到注解之上表示,被注解的注解存活时间。取值一共有3个:
RetentionPolicy.SOURCE:注解只在源码阶段存活,在编译器进行编译时它将会被丢弃忽略
RetentionPolicy.CLASS:注解只会保留到编译进行的时候,它并不会被加载到jvm中
RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,会被加载到jvm中,所以程序运行的时候可以获取到它们。
具体格式如下:
@Retention(RetentionPolicy.RUNTIOME)
public @interface TestAnontation{
}
复制代码
表示注解TestAnontation可以在程序运行的时候被获取。
@Documented
作用是能够将注解中的元素包含到javadoc中。
@Target
@Target指定了注解运用的地方,限定注解的运用场景。
取值有:
ElementType.ANONTATION_TYPE:给注解进行注解
ElementType.CONSTRUCTOR:给构造方法进行注解
ElementType.FIELD:给属性进行注解
ElementType.LOCAL_VARIABLE:给局部变量进行注解
ElementType.METHOD:给方法进行注解
ElementType.PACKAGE:给一个包进行注解
ElementType.PARAMETER:给一个方法内的参数进行注解
ElementType.TYPE:给一个类型进行注解,比如类、接口、枚举。
@Inherited
当一个类被一个带有@Inherited注解的注解进行注解后,如果这个类的子类没有被任何注解进行注解的话,那么这个子类就继承了这个父类的注解。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnontation{
}
@MyAnontation
public class A{
}
public calss B extends A{
}
复制代码
A类和B类同时拥有注解MyAnontation。
@Repeatable
配合容器注解使注解的值可以取多个。
@interface Animals{
Animal[] value();
}
@Repeatable(Animals.class)
@interface Animal{
String role() default "";
}
@Animal(role="dog")
@Animal(role="cat")
public class Test{
}
复制代码
Animals表示容器注解,必须要有一个value属性,属性的类型为@Repeatable注解的注解数组。
注解的属性
注解的属性也就是注解的成员变量,注解没有方法,注解的成员变量在注解中的定义以“无参数的方法”形式来声明,方法名为成员变量的名字,返回值为成员变量的类型。默认值由default表示。
@interface Animal{
int num();
String role() default "";
}
复制代码
赋值方式如下:
@Animal(num=29,role="cat")
public class Test{
}
复制代码
如果注解中只有一个名字为value的成员变量时可以直接用以下方式赋值:
@interface Animal{
String value();
}
复制代码
赋值方式如下:
@Animal("cat")
public class Test{
}
复制代码
如果没有任何的成员变量,则可以将括号一起省略。比如元注解中的@Inherited.
从官网信息来看:注解有许多用处,主要如下:
- 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
- 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
- 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取