Java-注解

注解

JDK1.5后的新特性,格式为@XXX.写于包,类,字段,局部变量,方法的前面.可以存在于SOURCE/CLASS/RUNTIME阶段.

注解的作用:

  • 编写文档:通过代码里标识的元数据生成文档。
  • 代码分析:通过代码里标识的元数据对代码进行分析。
  • 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

Java中基本内置注解

  1. @Override

    标记该方法是覆盖超类的方法,乱写编辑器会报错.

  2. @Deprecated

    用于标记该方法已经过时,编辑器会在该方法上显示删除线.

  3. @SuppressWarnings

    忽略编辑器的警告信息.(参数可以限定忽略那些警告信息)

自定义注解

  1. 注解声明

    使用@interface 来声明注解,类似于classinterface .

  2. 注解本质分析

    生成的class反编译后发现,注解本质是一个接口,拓展了java.lang.annotation.Annotation接口.

  3. 注解成员

    注解可以有属性(不使用)

    也可以有注解属性,例如:

    1
    public String show();
  4. 注解类型

    • 基本类型
    • String
    • 枚举
    • 注解类型
    • Class类型
    • 以上类型的一维注解类型
  5. 注解属性的使用

    1. 单个注解: @MyAnnotation(str="aaa").
    2. 多个注解: @MyAnnotation(str="aaa",i=10).
    3. 声明时给注解类型默认值: double d() default 1.23.
    4. 如果属性是数组类型: @MyAnnotation(strs={"1","2","3","4"...}) ,数组仅仅有一个值时可以省略{ } 号.
    5. 给属性 value 赋值: @MyAnnotation("aaa") ,直接写进去前提是没有其他属性值.
    6. 给数组数据value赋值: @MyAnnotation({"a","b","c"}) ,前提是没有其他属性值.
  6. 元注解

    1. 什么是元注解

      用于修饰注解的注解,可以描述注解在什么范围,什么阶段使用.

    2. 四个元注解

      • @Retention (必须写)

        指定注解信息在哪个阶段存在 Source | Class | Runtime

        分别代表存在于编译阶段,存在于解析执行阶段,存在于JVM中.

      • @Target (必须写)

        指定注解修饰对象的Type,有类,接口,成员变量,方法等

        1
        2
        3
        4
        5
        6
        7
        8
        ANNOTATION_TYPE		注解类型声明
        CONSIRUCTOR 构造方法声明
        FIELD 字段声明(包括枚举常量)
        LOCAL_VARIABLE 局部变量声明
        METHOD 方法声明
        PACKAGE 包声明
        PARAMETER 参数声明
        TYPE 类,接口或枚举声明
      • @Documented

        使用该元注解修饰,该注解信息可以生成到javadoc文档中.

      • @Inherited

        如果一个注解使用该元注解修饰,应用注解目标的子类会自动继承该注解.

自定义注解的使用

需要使用到反射来使用:

示例(获得数据库连接):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JDBC {
String driverClass();
String url();
String username();
String password();
}
//使用注解
@JDBC(driverClass = "com.mysql.jdbc.Driver", url = "jdbc:mysql://localhost:3306/web?useSSL=false", username = "root", password = "123456")
public static Connection getConntion() throws NoSuchMethodException, ClassNotFoundException, SQLException {
String diverClass = "";
String url = "";
String username = "";
String password = "";

Class c = JDBCUtils.class;
Method method = c.getDeclaredMethod("getConntion");
boolean b = method.isAnnotationPresent(JDBC.class);
if (b) {
JDBC jdbc = method.getAnnotation(JDBC.class);
diverClass = jdbc.driverClass();
url = jdbc.url();
username = jdbc.username();
password = jdbc.password();
System.out.println(diverClass);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}

Class.forName(diverClass);

Connection conn = DriverManager.getConnection(url, username, password);

return conn;
}