Java注解
1 基本语法
1.1 定义一个注解
注解的定义与接口的定义类似,也会在编译期被编译为class字节码文件。
一个注解例子如下:
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface UseCase {
public int id();
public String description() default "no description";
}
其中,@Retention、@Target作为元注解,用来标识该useCase用在什么地方,或者在哪个级别可用。
1.2 元注解
Java5.0的时候引入了四种元注解@Target、@Retention、@Inherited、。
- **@Target:**表示该注解可以用在什么地方。
- CONSTRUCTOR:构造器
- FIELD:域
- LOCAL_VARIABLE:局部变量
- METHOD:方法声明
- PACKAGE:包声明
- PARAMETER:参数声明
- TYPE:类、接口
- @Retention:表示需要在什么样的级别保存该注解信息
- SOURCE:在源代码级别,将会被编译器丢弃
- CLASS:在字节码文件中可用,会被虚拟机丢弃
- RUNTIME:VM在运行时也会保留该注解,可以通过反射机制读取注解信息
- @Inherited:允许子类继承父类中的注解,只在注解对类使用时生效,子类中的方法(无论是否重写)或者属性都可以继承父类的注解
- @Documented:将此注解保存在Javadoc中
java8新增了两个元注解,分别是@Native与@Repeatable。@Native注解不常使用,主要用于注解成员变量表示其可以被本地代码引用。而@Repeatable可用于对同一注解多次使用时。在Java8.0之前,对同一注解的多次使用做法如下:
public @interface Roles {
Role[] roles();
}
public @interface Role {
String roleName();
}
public class RoleTest {
@Roles(roles = {@Role(roleName = "role1"), @Role(roleName = "role2")})
public String doString(){
return "java";
}
}
使用@Repeatable之后:
public @interface Roles {
Role[] value();
}
@Repeatable(Roles.class)
public @interface Role {
String roleName();
}
public class RoleTest {
@Role(roleName = "role1")
@Role(roleName = "role2")
public String doString(){
return "java";
}
}