Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 349|回复: 0

[注解学习]揭开注解Annotation的面纱

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 23:56:37 | 显示全部楼层 |阅读模式
    Annotation是java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。
       

       
        这些都是使用别人定义的注解,一般注解的使用都是在一些基础框架或者类库中来定义的,因此很少见过有人自己去写一个注解出来并使用在程序中,因此注解的使用常常给人感觉很神秘,这就为你揭开注解的面纱。
       
       
         
       
       
           注解的神秘之处在于:通过类似注释的方式,可以控制程序的一些行为,运行时的状态,可以为成员赋值,做配置信息等等,与常规编码思维大相径庭。
       

       
        只用别人定义好的注解是搞不懂这些问题的,要想真正知道注解内部的秘密,要自己定义注解,然后在程序中获取注解信息,拿到注解信息后,就可以为我所用了。
         
      
       
       
         
       

         
       
      



      下面我简单演示下三类注解的用法:类注解、方法注解、字段(也称之域)注解的定义与适用,并看看如何获取注解的信息。
      

       
      

      一、定义注解
      

       
      
      
      
       package lavasoft.anntest;
       

       

       import java.lang.annotation.ElementType;
       

       import java.lang.annotation.Retention;
       

       import java.lang.annotation.RetentionPolicy;
       

       import java.lang.annotation.Target;
       

       

       /**
    * 类注解
    *
    * @author leizhimin 2009-12-18 14:15:46
    */
       

       
    @Retention(RetentionPolicy.RUNTIME)
       
    @Target(ElementType.TYPE)
       

       public @
       interface MyAnnotation4Class {
       
             
       public String msg();
       
    }
       
      

       
      
      
      
       package lavasoft.anntest;
       

       

       import java.lang.annotation.ElementType;
       

       import java.lang.annotation.Retention;
       

       import java.lang.annotation.RetentionPolicy;
       

       import java.lang.annotation.Target;
       

       

       /**
    * 方法注解
    *
    * @author leizhimin 2009-12-18 14:16:05
    */
       
    @Retention(RetentionPolicy.RUNTIME)
       
    @Target(ElementType.METHOD)
       

       public @
       interface MyAnnotation4Method {
       
             
       public String msg1();
       

       
             
       public String msg2();
       
    }
       
      

       
      
      
      
       package lavasoft.anntest;
       

       

       import java.lang.annotation.ElementType;
       

       import java.lang.annotation.Retention;
       

       import java.lang.annotation.RetentionPolicy;
       

       import java.lang.annotation.Target;
       

       

       /**
    * 字段注解
    *
    * @author leizhimin 2009-12-18 15:23:12
    */
       
    @Retention(RetentionPolicy.RUNTIME)
       
    @Target(ElementType.FIELD)
       

       public @
       interface MyAnnotation4Field {
       
             
       public String commont();
       

       
             
       public
       boolean request();
       
    }
       
      

       
      

      二、写一个类,用上这些注解
      

       
      
      
      
       package lavasoft.anntest;
       

       

       /**
    * 一个普通的Java类
    */
       
    @MyAnnotation4Class(msg =
       "测试类注解信息")
       

       class TestClass {
       
             @MyAnnotation4Field(commont =
       "成员变量的注解信息", request =
       true)
       
             
       private String testfield;
       

       
             @MyAnnotation4Method(msg1 =
       "测试方法注解信息1", msg2 =
       "测试方法注解信息2")
       
             
       public
       void testMethod() {
       
                     System.out.println(
       "Hello World!");
       
             }
       
    }
       
      

       
      

      三、测试注解
      

       
      

      为了使用注解,需要通过反射获取注解的对象。通过注解对象来操作注解信息。
      
      
      
       package lavasoft.anntest;
       

       

       import java.lang.reflect.Field;
       

       import java.lang.reflect.Method;
       

       

       /**
    * 测试类
    *
    * @author leizhimin 2009-12-18 14:13:02
    */
       

       public
       class TestOptAnnotation {
       
             
       public
       static
       void main(String[] args)
       throws NoSuchMethodException, NoSuchFieldException {
       
                     TestClass t =
       new TestClass();
       
                     System.out.println(
       "-----------MyAnnotation4Class注解信息---------");
       
                     MyAnnotation4Class an4clazz = t.getClass().getAnnotation(MyAnnotation4Class.
       class);
       
                     System.out.println(an4clazz.msg());
       
                     System.out.println(
       "-----------MyAnnotation4Method注解信息---------");
       
                     Method method = t.getClass().getMethod(
       "testMethod",
       new Class[0]);
       
                     MyAnnotation4Method an4method = method.getAnnotation(MyAnnotation4Method.
       class);
       
                     System.out.println(an4method.msg1());
       
                     System.out.println(an4method.msg2());
       
                     System.out.println(
       "-----------MyAnnotation4Field注解信息---------");
       
                     Field field = t.getClass().getDeclaredField(
       "testfield");
       
                     MyAnnotation4Field an4field = field.getAnnotation(MyAnnotation4Field.
       class);
       
                     System.out.println(an4field.commont());
       
                     System.out.println(an4field.request());
       
             }
       
    }
       
      

       
      

      运行结果:
      
      
      
       -----------MyAnnotation4Class注解信息---------
       
    测试类注解信息
       
    -----------MyAnnotation4Method注解信息---------
       
    测试方法注解信息1
       
    测试方法注解信息2
       
    -----------MyAnnotation4Field注解信息---------
       
    成员变量的注解信息
       

       true
       

       
    Process finished with exit code 0
       
      

       
      

      四、总结
      

       
      

      看完上面的测试过程,Annotation已经不再神秘了,这里总结下自定义注解的使用方法:
      

       
      

      1、自定义注解,注意注解的时空范围,简单说就是注解针对的目标(类、方法、字段),以及注解的时效(运行时、或者源码中有效)。
      

       
      

      2、要获取注解的信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法。
      

       
      

      3、获取了注解对象,就可以调用注解的方法来获取相对应的值了。为基础框架所用。
      

       
      

      4、当然,注解也可以没有定义成员,这样注解就成了一个标记符号了。
      

       
      

      理解了这些,注解就不再神秘了。
      

       
      
    本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/245407




      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 02:00 , Processed in 0.311796 second(s), 44 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表