Java注解 | 青训营笔记

121 阅读3分钟

这是我参加【第四届青训营】笔记创作活动的第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文档或者做其它相应处理。
  • 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取