Java-注解


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";
    }
}

文章作者: Jacob
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jacob !
  目录