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

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

  • 相关阅读:
    Android相对布局RelativeLayout常用到的属性
    用LinkedList模拟队列(Java容器)
    JAVA数组(一)
    SQL分页查询(转)
    asp.net 子窗体和父窗体交互
    Silverlight加载外部XAP包和页面
    As.net 动态反射程序集里面DLL并创建对象
    Silverlight LIstBox 实现横向排列元素 并且自动换行
    java jdbc 连接SQL数据库
    Silverlight Command的运用
  • 原文地址:https://www.cnblogs.com/lihao007/p/10493099.html
Copyright © 2011-2022 走看看