zoukankan      html  css  js  c++  java
  • java 注解 知识整理

    一、前言

    注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从java 5 开始引入的。通过使用注解,我们可以将元数据保存在Java源代码之中,并利用annotation API为注解构造处理工具。

    二、语法

    ●从语法的角度来看,注解的使用方式几乎与修饰符的使用一模一样。它的元素看起来就像接口的方法,唯一的区别是你可以为其指定默认值。

    ●注解包过三种标准注解和四种元注解,以及自定义注解。

    ★★★标准注解★★★

    @Override:方法的覆盖

    @Deprecated:弃用,表示当前api停止使用

    @SuppressWarnings:关闭不当的编译器警告信息。

    ★★★元注解★★★

    @Target:表示该注解作用于什么地方

           ElementType.FIELD                       // 字段、枚举的常量
      ElementType.METHOD                  // 方法
      ElementType.PARAMETER)          // 方法参数
      ElementType.CONSTRUCTOR     // 构造函数
      ElementType.LOCAL_VARIABLE  // 局部变量
      ElementType.ANNOTATION_TYPE   // 注解
      ElementType.PACKAGE               // 包

    @Retention:保存注解信息的级别

           RetentionPolicy.SOURCE    // 注解仅存在于源码中,在class字节码文件中不包含
           RetentionPolicy.CLASS     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
           RetentionPolicy.RUNTIME   // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

    @Documented:将此注解包含在Javadoc中

    @Inherited:允许子类继承父类中的注解

    ●编译器对元素的默认值过分挑剔。也就是说,元素要么具有默认值,要么必须在使用注解时提供元素的值。其次,对于非基本类型的元素,无论在源码中声明,还是在注解接口中定义默认值,都不能以null作为其值。为了避开这个约束,可以定义一些特殊的值,如空字符串或是负数,比如(-1)等。这也是在定义注解时,一个习惯用法。

    三、自定义注解demo

    1 @Documented
    2 @Inherited
    3 @Target({ ElementType.FIELD, ElementType.METHOD })
    4 @Retention(RetentionPolicy.RUNTIME)
    5 public @interface Init
    6 {
    7     public String value() default "";
    8 }
     1 public class User
     2 {
     3     private String name;
     4     private String age;
     6     public String getName()
     7     {
     8         return name;
     9     }
    11     @Init(value = "lee")
    12     public void setName(String name)
    13     {
    14         this.name = name;
    15     }
    17     public String getAge()
    18     {
    19         return age;
    20     }
    22     @Init(value = "66")
    23     public void setAge(String age)
    24     {
    25         this.age = age;
    26     }
    27 }
     1 public class UserFactory
     2 {
     3     public static User create()
     4     {
     5         User user = new User();
     6 
     7         // 获取User类中所有的方法(getDeclaredMethods也行)
     8         Method[] methods = User.class.getMethods();
     9 
    10         try
    11         {
    12             for (Method method : methods)
    13             {
    14                 // 如果此方法有注解,就把注解里面的数据赋值到user对象
    15                 if (method.isAnnotationPresent(Init.class))
    16                 {
    17                     Init init = method.getAnnotation(Init.class);
    18                     method.invoke(user, init.value());
    19                 }
    20             }
    21         }
    22         catch (Exception e)
    23         {
    24             e.printStackTrace();
    25             return null;
    26         }
    27 
    28         return user;
    29     }
    30 }
    View Code
     1 public class Test
     2 {
     3     public static void main(String[] args) throws IllegalAccessException,
     4             IllegalArgumentException, InvocationTargetException
     5     {
     6         User user = UserFactory.create();
     7 
     8         System.out.println(user.getName());
     9         System.out.println(user.getAge());
    10     }
    11 }
    View Code

    大家可以自己执行代码,看看结果。

    参考文章:

    《Thinking in Java》

    https://www.cnblogs.com/liangweiping/p/3837332.html

    ----------------------------------------------------------------------

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/lihao007/p/10493099.html
Copyright © 2011-2022 走看看