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

[注解学习]Java Annotation(1)

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

    [LV.1]初来乍到

    发表于 2014-10-29 23:58:05 | 显示全部楼层 |阅读模式
    摘要
           Annotation(注释)是J2SE 5.0引入的新功能,它被定义为JSR-175规范。简单地说,它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。本文只会介绍注释的基本概念,以及java内置注释的使用方法;关于定制注释及其他高级主题将在下一篇文章中讲解。
             
         
          
           正文
           编程的一个最新的趋势,尤其是在Java编程方面,就是使用元数据。直到JSR-175 提案的通过,并在J2SE 5.0上实现,你才有了使用注释的机会,在不断的发展和演进中,基于JSR-181的元数据批注标准,能让我们更轻松的开发和部署Web Service了,不需要被大量的配置文件所烦恼,说得有点远了,转回整体,元数据是可以添加到代码中的修饰符,它可以用于包声明、类型声明、构造函数、方法、字段、参数和变量。J2SE包含内置注释,还支持你自己编写的定制注释。
            
      
       
       
         
       

         
       
      
      
       内容
          l         注释基本知识
          l         元数据的作用
          l         基本内置注释
          l         概要
          
      
       
        注释基础知识
             在J2SE 5.0中,注释是以‘@注释名’在代码中存在的,例如:J2SE 5.0内置的注释:@Override、@Deprecated;有的注释还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked");对于这种只有一个参数,且参数名为value的注释,我们在使用时可以简写为:@SuppressWarnings("unchecked")。
         
          根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。
          
       
       
        元数据的作用
          如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
          l         编写文档:通过代码里标识的元数据生成文档。
          l         代码分析:通过代码里标识的元数据对代码进行分析。
          l         编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。
          
      
       
        基本内置注释
              @Override注释能实现编译时检查,你可以为你的方法添加该注释,以声明该方法是用于覆盖父类中的方法。如果该方法不是覆盖父类的方法,将会在编译时报错。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释;代码如下:
         
      package com.gelc.annotation.demo.basic;
          
      
       
        public class OverrideDemo {
          
      
       
            // @Override
             public String tostring() {
          
      
       
                return super.toString();
             }
         }
         在编译时,则会提示以下错误信息:
          OverrideTest.java:5: 方法未覆盖其父类的方法
                  @Override
                  ^
         1 错误
         
          就像示例演示的那样,该注释一大好处就是可以在编译时帮我们捕获部分编译错误,但又有多少编程人员愿意为每个覆盖父类的方法添加该注释呢?这个只有靠编程人员自己进行取舍了。
          
      
       
            @Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,使用@Deprecated的示例代码示例如下:
           package com.gelc.annotation.demo.basic;
          
      
       
        public class DeprecatedDemo {
          
      
       
            public static void main(String[] args) {
          
      
       
                // DeprecatedClass.DeprecatedMethod();
             }
         }
          
      
       
        class DeprecatedClass {
          
      
       
            @Deprecated
             public static void DeprecatedMethod() {
                 // TODO
             }
         }
             编译时,会得到以下提示:
          注意:DeprecatedDemo.java 使用或覆盖了已过时的 API。
          注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
         
          如果在编译时添加-Xlint:deprecation参数,我们能更清楚的看到该警告的详细信息,如下:
          DeprecatedDemo.java:6: 警告:[deprecation] SomeClass 中的 DeprecatedMethod() 已
          过时
                          SomeClass.DeprecatedMethod();
                                  ^
         1 警告
         
          通过上面的示例,你已经掌握到了如何使用@Deprecated,但你理解到@Deprecated与@deprecated的区别了吗?你可以简单的理解为:@Deprecated是为了编译时检查,而@deprecated是为了生成文档的需要,各尽其责。
          
      
       
            @SuppressWarnings与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:
         


      

      
       
       
        参数
               
        语义
               
       
       
        deprecation
               
        使用了过时的类或方法时的警告
               
       
       
        unchecked
               
        执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型
               
       
       
        fallthrough
               
        当 Switch 程序块直接通往下一种情况而没有 Break 时的警告
               
       
       
        path
               
        在类路径、源文件路径等中有不存在的路径时的警告
               
       
       
        serial
               
        当在可序列化的类上缺少 serialVersionUID 定义时的警告
               
       
       
        finally
               
        任何 finally 子句不能正常完成时的警告
               
       
       
        all
               
        关于以上所有情况的警告
               
       
       
      

         通过上面的表格,你应该了解到每个参数的用意了,下面我就以一个常用的参数unchecked为例,为你展示如何使用@SuppressWarnings注释,示例代码如下:
         
      package com.gelc.annotation.demo.basic;
          
      
       
        import java.util.List;
         import java.util.ArrayList;
          
      
       
        public class SuppressWarningsDemo {
          
      
       
            public static List cache = new ArrayList();
          
      
       
            // @SuppressWarnings(value = "unchecked")
             public void add(String data) {
          
      
       
                cache.add(data);
             }
         }
             当我们不使用@SuppressWarnings注释时,编译器就会有如下提示:
          注意:SuppressWarningsDemo.java 使用了未经检查或不安全的操作。
          注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
         
      相信你对这个提示相当熟悉了,我就不在这里多说了。下面我们还是来试试使用了@SuppressWarnings(value="unchecked")注释会是什么效果,它会屏蔽编译时的警告信息,这也就是它所要达到的目的。另外,由于@SuppressWarnings注释只有一个参数,并且参数名为value,所以我们可以将上面一句注释简写为@SuppressWarnings("unchecked")。
          
      
       
        概要
        在J2SE 5.0出现三个多年头后的今天,再回头看看它当时引入的这一新特性,虽然它已不是什么新概念了,还是值得我们再次回味的,下面文章中将介绍编程人员如何定制注释。
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-25 23:27 , Processed in 0.331430 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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