注解概述
java注解又称标注,是JDK5引入的一种注释技术
java中的类,构造器,方法,成员变量,参数都可以被注解进行标注
作用
对java中类,方法,成员变量进行标注,然后进行特殊处理
在我们非常熟悉的Junit框架中就用到了@Test标签进行标注
自定义注解
对注解有了初步的了解,接下来让我们来自己写一个注解
下面就是一个最简单的注释了
public @interface My {
String name();
int[] numbers();
double number();
}
它可以用在这里
public class Demo01 {
@My(name = "张三",numbers = {114514,1919810},number = 10086)
public static void main(String[] args) {
}
}
这里
@My(name = "张三",numbers = {114514,1919810},number = 10086)
public class Demo01 {
public static void main(String[] args) {
}
}
还有这里
public class Demo01 {
@My(name = "张三",numbers = {114514,1919810},number = 10086)
private String name;
public static void main(String[] args) {
}
}
还有一个特殊的属性value,它以下的特性
如果只有一个value属性的情况下,使用value属性的时候可以忽略value名称不写
public @interface My {
String value();
}
public class Demo01 {
@My("123456")
private String name;
public static void main(String[] args) {
}
}
如果有多个属性,且多个属性没有默认值,那么value名称是不可以省略的
public @interface My {
String value();
double price() default 9.9;
}
public class Demo01 {
@My("123456")
private String name;
public static void main(String[] args) {
}
}
元注解
简单来所是注解注解的注解
两个元注解
@Target
约束自定义注解只能在哪些地方使用
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})
public @interface My {
String value();
double price() default 9.9;
}
TYPE | 类,接口 |
FIELD | 成员变量 |
METHOD | 成员方法 |
PARAMETER | 方法参数 |
CONSTRUCTOR | 构造器 |
LOCAL_VARIABLE | 局部变量 |
@Retention
声明注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface My {
String value();
double price() default 9.9;
}
RUNTIME | 注解在源码阶段,字节码阶段,运行阶段均正常使用 |
CLASS | 注解作用在源码阶段,字节码阶段,默认值 |
SOURCE | 注解在作用在源码阶段 |
注解解析
判断是否存在注解,存在就解析出内容
下面是一个解析的小例子
@Test
public void ClassTest() throws Exception {
//获取类上的标签
Class c=bookstore.class;
//判断是否存在改标签
if(c.isAnnotationPresent(Book.class)){
Book book=(Book) c.getDeclaredAnnotation(Book.class);
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.author()));
}
//获取方法上的标签
Method method=c.getDeclaredMethod("test");
if(method.isAnnotationPresent(Book.class)){
Book book=(Book) method.getDeclaredAnnotation(Book.class);
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.author()));
}
}
运行结果