2-Java注解

前言

注解在Java SE5中引入。注解好处多多,TA可以使我们的代码变得简洁,减少样板代码,还能存储有关程序的额外信息。程序员还可以自定义注解

1
2
3
4
5
// @Override为注解
@Override
public String toString() {
return "ConferencePaper:" + getTitle();
}

Java内置注解

  • @Override // 表示被注解的方法为重写的父类方法
  • @Deprecated // 表示被注解的元素已被废弃,不推荐使用
  • @SuppressWarnings // 压制不当的警告

元注解

用来自定义注解

  • @Target

    表示注解用于什么

    可选参数(ElementType类型):

    • CONSTRUCTOR
    • FIELD
    • LOCAL_VARABLE
    • METHOD
    • PACKAGE
    • PATAMETER
    • TYPE
  • Retention

    表示注解保存到什么级别

    可选参数(RetentionPolicy类型):

    • SOURCE
    • CLASS // 在.class文件中可用,但运行时不会加载到虚拟机
    • RUNTIME
  • Documented

    将此注解包含在Javadoc中

  • Inherited

    允许子类继承父类中的注解

自定义注解

使用上面的元注解来自定义注解

标记注解

1
2
3
4
5
// 自定义注解示例
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}

使用@interface关键字来表明Test是一个注解,像这样的注解中没有任何元素的称为标记注解。

带元素的注解

1
2
3
4
5
6
7
// 带元素的注解示例
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
int id();
String description() default "no description";
}

使用时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@UseCase(id = 19)
public void checkId() {

}

@UseCase(id = 19, description = "for checking name")
public boolean checkName() {
return false;
}

@UseCase(description = "for checking age", id = 20)
public boolean checkAge() {
return false;
}

如上所示,使用id=19这样传值,顺序任意。可见设置了default值的可省略传值,使用默认值。

注解元素

  • 所有基本类型(int,float,boolean,byte,double,char,long,short)
  • String
  • Class
  • enum
  • Annotation
  • 上述类型的数组

处理自定义注解

如果没有用来读取注解的工具,那注解也不会比注释更有用。

处理注解就需要我们编写注解处理类,用到了上一篇文章讲到的反射

2019-10-18 20:46:01