ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java自定义注解

2022-09-05 00:31:08  阅读:205  来源: 互联网

标签:Java String 自定义 return Init User 注解 public


  1. 简介
    注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
  2. 元注解的介绍
    元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解
    @Target
    @Retention
    @Documented
    @Inherited
    1. @Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的。它使用一个枚举类型定义如下
      public enum ElementType {
          /** 类、接口(包括注解类型)或枚举声明 */
          TYPE,
      
          /** 字段声明(包括枚举常量) */
          FIELD,
      
          /** 方法声明 */
          METHOD,
      
          /** 形式参数声明 */
          PARAMETER,
      
          /** 构造函数声明 */
          CONSTRUCTOR,
      
          /** 局部变量声明 */
          LOCAL_VARIABLE,
      
          /** 注解类型声明 */
          ANNOTATION_TYPE,
      
          /** 包装声明 */
          PACKAGE,
      
          /**
           * 类型参数声明
           *
           * 自从:1.8
           */
          TYPE_PARAMETER,
      
          /**
           * 使用类型
           *
           * 自从:1.8
           */
          TYPE_USE
      }
    2. @Retention表明该注解的生命周期
      生命周期类型 描述
      RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中
      RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值
      RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到
    3. @Document表明该注解标记的元素可以被Javadoc 或类似的工具文档化。
    4. @Inherited表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解。
  3. 自定义注解

    修饰符: 访问修饰符必须为public,不写默认为pubic;
    关键字: 关键字为@interface;
    注解名称: 注解名称为自定义注解的名称,使用时还会用到;
    注解内容: 注解中内容,对注解的描述。

    1. 自定义注解 
      @Documented
      @Inherited
      @Target({ ElementType.FIELD, ElementType.METHOD ,ElementType.TYPE}) //可以在字段、枚举的常量、方法
      @Retention(RetentionPolicy.RUNTIME)
      public @interface Init {
      String value() default "";
      }
    2.  

      数据模型使用注解

      public class User {
      private String name;
      private String age;
      
      public String getName() {
      return name;
      }
      
      @Init("louis")
      public User setName(String name) {
      this.name = name;
      return this;
      }
      
      public String getAge() {
      return age;
      }
      
      @Init("22")
      public User setAge(String age) {
      this.age = age;
      return this;
      }
      } 

    3. 定义一个“注解解析器”

      public class userFactory {
      
      public static User create() {
      User user = new User();
      
      
      // 获取User类中所有的方法(getDeclaredMethods也行)
      Method[] methods = User.class.getMethods();
      
      
      try
      {
      for (Method method : methods)
      {
      // 如果一个注解指定注解类型是存在于此元素上此方法返回true,否则返回false
      //参数 -- 对应于注解类型的Class对象
      if (method.isAnnotationPresent(Init.class))
      {
      //此方法返回该元素的注解在此元素的指定注释类型(如果存在),否则返回null
      Init init = method.getAnnotation(Init.class);
      // 如果Method代表了一个方法 那么调用它的invoke就相当于执行了它代表的这个方法,在这里就是给set方法赋值
      method.invoke(user, init.value());
      }
      }
      }
      catch (Exception e)
      {
      e.printStackTrace();
      return null;
      }
      
      
      return user;
      }
      }

    4. 测试运行

标签:Java,String,自定义,return,Init,User,注解,public
来源: https://www.cnblogs.com/gpingguo/p/16656646.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有