Fork me on GitHub

Java 注解入门

1.什么是注解

  1. 注解的语法: @注解名称;
  2. 注解的作用: 用来替代 xml 配置文件; 在 Servlet 3.0 中就可以使用注解来代替配置文件;
  3. 注解是由框架来读取使用的;
  4. 所有的注解都是 Annotation 的子类;
  5. 简单说, 注解是给程序(框架)看到, 而注释是给人看的.

2. 注解的使用

  • 定义注解类: 框架的工作; 语法: public @interface MyAnnotation{....}.
  • 使用注解: 程序员的工作;
  • 读取注解(反射): 框架的工作;

3. 注解的属性

3.1 定义属性
  • 格式: 类型 属性名();
// 定义属性
    @interface MyAnno2 {
        int age();  // 定义属性 age
        String name(); // 定义属性 name
        String value() default "hello world!";  // value 是带有默认值的属性
    }
3.2 使用注解时,给属性赋值
    @MyAnno2(age=100, name="zhangsan")
    public class Demo{
        ......
    }
3.3 属性名为 value 的特权
  • 当使用注解时, 如果只给名为 value 的属性赋值时,可以省略 "value="
    例如: @MyAnno(value="hello") 可以书写成 @MyAnno("hello")
3.4 注解属性的类型
  • 八种基本数据类型
  • String 类型
  • Enum 类型
  • Class 类型
  • 注解类型
  • 以上类型的一维数组类型
  • Integer 类型不可以
    @MyAnno2(
        // 为注解属性赋值
        a=100,
        b="hello",
        c=MyEnum1.A,
        d=String.class,
        e=@MyAnno3(aa=200,bb="world"),
        f={"",""}  // 如果数组中的元素个数为1时, 可以省略大括号
    )
    public class Demo{

    }

    // 定义注解
    @interface MyAnno2 {
        int a();
        String b();
        MyEnum1 c(); // Enum 类型
        Class d();
        MyAnno3 e();
        String[] f(); // 数组类型
    }

    @interface MyAnno3 {
        int aa();
        String bb;
    }

4. 注解的作用目标限定以及保留策略限定

4.1 注解的作用目标限定
  • 使用方式: 在定义注解时,给注解添加 @Target 注解;
    @Target(value={ElementType.Type, ElementType.METHOD, ElementType.FIELD})
    @interface MyAnno2{

    }

    // ElementType 是枚举类型
    // 可选值: TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,
    //       ANNOTATION, PACKAGE
4.2 保留策略
  • 源代码文件(SOURCE): 注解只能在源代码中存在,当编译时,就被忽略了;
  • 字节码文件(CLASS): 注解在源代码中存在,然后编译时,会把注解信息放到 class 文件,但 JVM 在加载类时,会忽略注解;
  • JVM (RUNTIME): 注解在源代码,字节码文件中存在,并且在 JVM 加载类时,会把注解加载到 JVM 内存中(它是唯一可反射注解!!)
    // 限定注解的保留策略, Retention 为枚举类型
    @Retention(RetentionPolicy.RUNTIME)
    @interface MyAnno2 {....}

参考资料:

posted @ 2017-10-16 19:16  小a的软件思考  阅读(152)  评论(0编辑  收藏  举报