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入门到精通教程
查看: 219|回复: 0

[注解学习]JAVA元数据注释初探

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

    [LV.1]初来乍到

    发表于 2014-10-28 23:56:42 | 显示全部楼层 |阅读模式
    java的元数据功能是JDK1.5才开始支持的,以前都没有,正因为是新支持的,所以有关于它的介绍挺少,用处也不太多,最近发现很多框架都可以把它用来配置一些东西,以代替以前比较复杂的XML配置.想像一下,在JAVA代码中直接写入注释来配置,那该是多么好的事情,让我们写习惯了代码和看习惯了代码的人来说,这无疑是一件很爽的事情. 我们可以使用JAVA内置的注释内型,如果觉得不够用,可以定义自己的注释内型,定义如下
      

    /*
       
      * MyType.java   
      *   
      * Created on 2006年12月7日, 下午3:40   
      *   
      * To change this template, choose Tools | Template Manager   
      * and open the template in the editor.   
      
    */
       
       

    package
      testAnno;   
       

    /**
       
      *   
      *
    @author
      lbf   
      
    */
       

    import
      java.lang.annotation.
    *
    ;   
    @Retention(RetentionPolicy.RUNTIME)   
    @Target({ElementType.TYPE,ElementType.METHOD})   

    public
      @
    interface
      MyType {   
         String authorName();   
         String lastModified();   
         String bugFixes()
    default
      
    "
    ok
    "
    ;   
    }

    这里我定义了一个我自己的注释类,声明方式和声明接口差不多,只不过在interface前面多了一个@符号.  注释类也可以用注释类注释,如此下去. @Retention(RetentionPolicy.RUNTIME)  这句表示它的保存范围是到RUNTIME,也就是运行时,这样在类运行的时候,我们也可以取到有关它的信息. @Target({ElementType.TYPE,ElementType.METHOD})   这句表示它的适用对象,它可以用在哪里地方,我这里定义的是它可以用在类的定义和方法的定义上 然后我们看我们是怎么为我们写的类加上注释的


    /*
       
      * Test1.java   
      *   
      * Created on 2006年12月7日, 下午3:34   
      *   
      * To change this template, choose Tools | Template Manager   
      * and open the template in the editor.   
      
    */
       
       

    package
      testAnno;   
       

    /**
       
      *   
      *
    @author
      lbf   
      
    */
       

    import
      java.lang.annotation.
    *
    ;   
    @MyType(authorName
    =
    "
    hadeslee
    "
    ,lastModified
    =
    "
    20061207
    "
    )   

    public
      
    class
      Test1 {   
             
         
    /**
      Creates a new instance of Test1
    */
       
         
    public
      Test1() {   
         }   
         @Deprecated   
         @MyType(authorName
    =
    "
    hadeslee
    "
    ,lastModified
    =
    "
    20061207
    "
    ,bugFixes
    =
    "
    what
    "
    )   
         
    public
      
    void
      doSth(){   
                   
         }   
         @MyType(authorName
    =
    "
    hadeslee
    "
    ,lastModified
    =
    "
    20061207
    "
    ,bugFixes
    =
    "
    what
    "
    )   
         
    public
      
    void
      doAnother(){   
                
         }   
    }   


    加了元数据的类和不加元数据的类差不多,只不过如果你的元数据注释如果是运行时的话,你的类文件可能会比不加元数据大一些,因为它必须把一些注释的信息写入到class文件中去,我们已经注释了我们的类,现在我们来看一下,我们如何去取我们的注释,


    /*   
      * GetAnno.java   
      *   
      * Created on 2006年12月7日, 下午3:46   
      *   
      * To change this template, choose Tools | Template Manager   
      * and open the template in the editor.   
      */
       
       

    package
      testAnno;   
       

    /**   
      *   
      *
    @author
      lbf   
      */
       

    import
      java.lang.annotation.*;   

    import
      java.lang.reflect.*;   

    public
      
    class
      GetAnno {   
             
         
    /** Creates a new instance of GetAnno */
       
         
    public
      GetAnno() {   
         }   
         
    public
      
    static
      
    void
      main(String[] args)
    throws
      Exception {   
             Test1 t=
    new
      Test1();   
             Class c=Test1.
    class
      ;   
             Annotation[] as= c.getDeclaredAnnotations();   
             
    for
    (Annotation an:as){   
                 System.out.println("类Test1的注释"+an);   
             }   
             System.out.println();
             Method med=c.getDeclaredMethod("doSth");   
             Annotation[] ass=med.getDeclaredAnnotations();   

             
    for
    (Annotation an:ass){   
                 Class< ?
    extends
      Annotation> clazz=an.annotationType();   
                 System.out.println("注释名:"+clazz.getName());
                 Annotation[] ased=clazz.getAnnotations();   
                
    for
    (Annotation ad:ased){   
                     System.out.println("注释的注释:"+ad);   
                 }   
                 System.out.println("方法doSth的注释:"+an);   
                 System.out.println();
             }   
         }   
    }   

    此程序输出如下 C:java>javac -d . *.java C:java>java testAnno.GetAnno
    类Test1的注释@testAnno.MyType(bugFixes=ok, authorName=hadeslee, lastModified=20061207) 注释名:java.lang.Deprecated
    注释的注释:@java.lang.annotation.Documented()
    注释的注释:@java.lang.annotation.Retention(value=RUNTIME)
    方法doSth的注释:@java.lang.Deprecated() 注释名:testAnno.MyType
    注释的注释:@java.lang.annotation.Retention(value=RUNTIME)
    注释的注释:@java.lang.annotation.Target(value=[TYPE, METHOD])
    方法doSth的注释:@testAnno.MyType(bugFixes=what, authorName=hadeslee, lastModified=20061207)
      简单的写了一点点关元数据的东西,希望对自己或者对别人有一点点帮助.     从这代码里,我们可以看出,取注释其实很简单,就是利用反射机制来取的.不过我们要特别注意到的一点是,我们不但可以取我们定义的类的注释,也可以取注释的注释,我们这里只取到了MyType的注释,其实还可以往下取,在取的过程中,我们可以看到这些元数据注释类都用了哪些注释:)


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/28/235641937.zip
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-26 02:30 , Processed in 0.380404 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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