全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java自定义注解的详解

Java自定义注解

Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解。

Java1.5引入了注解,当前许多java框架中大量使用注解,如hibernate、Jersey、spring。注解作为程序的元数据嵌入到程序当中。注解可以被一些解析工具或者是编译工具进行解析。我们也可以声明注解在编译过程或执行时产生作用。

在使用注解之前,程序源数据只是通过java注释和javadoc,但是注解提供的功能要远远超过这些。注解不仅包含了元数据,它还可以作用于程序运行过程中、注解解释器可以通过注解决定程序的执行顺序。例如,在Jersey webservice 我们为方法添加URI字符串的形式的**PATH**注解,那么在程序运行过程中jerser解释程序将决定该方法去调用所给的URI。

创建Java自定义注解

创建自定义注解和创建一个接口相似,但是注解的interface关键字需要以@符号开头。我们可以为注解声明方法。我们先来看看注解的例子,然后我们将讨论他的一些特性。

package com.journaldev.annotations;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
  public @interface MethodInfo{
  String author() default 'Pankaj';
  String date();
  int revision() default 1;
  String comments();
}
  • 注解方法不能带有参数;
  • 注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者是这些类型的数组;
  •  注解方法可以有默认值;
  •  注解本身能够包含元注解,元注解被用来注解其它注解。

这里有四种类型的元注解:

1. @Documented —— 指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API。

2. @Target——指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解没有出现,那么定义的注解可以应用于程序的任何元素。

3. @Inherited——指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。

4.@Retention——指明了该Annotation被保留的时间长短。RetentionPolicy取值为SOURCE,CLASS,RUNTIME。

Java内建注解

Java提供了三种内建注解。

1. @Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。

2. @Deprecated——当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。Java在javadoc 中推荐使用该注解,我们应该提供为什么该方法不推荐使用以及替代的方法。

3. @SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)并且被编译器丢弃。

我们来看一个java内建注解的例子参照上边提到的自定义注解。

package com.journaldev.annotations;
 
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
 
public class AnnotationExample {
 
public static void main(String[] args) {
}
 
@Override
@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 1)
public String toString() {
  return 'Overriden toString method';
}
 
@Deprecated
@MethodInfo(comments = 'deprecated method', date = 'Nov 17 2012')
public static void oldMethod() {
  System.out.println('old method, don't use it.');
}
 
@SuppressWarnings({ 'unchecked', 'deprecation' })
@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 10)
public static void genericsTest() throws FileNotFoundException {
  List l = new ArrayList();
  l.add('abc');
  oldMethod();
}
 
}

相信这个例子可以不言自明并能展示在不同场景下的应用。

Java注解解析

我们将使用反射技术来解析java类的注解。那么注解的RetentionPolicy应该设置为RUNTIME否则java类的注解信息在执行过程中将不可用那么我们也不能从中得到任何和注解有关的数据。

package com.journaldev.annotations;
 
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
 
public class AnnotationParsing {
 
public static void main(String[] args) {
  try {
  for (Method method : AnnotationParsing.class
    .getClassLoader()
    .loadClass(('com.journaldev.annotations.AnnotationExample'))
    .getMethods()) {
    // checks if MethodInfo annotation is present for the method
    if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {
      try {
    // iterates all the annotations available in the method
        for (Annotation anno : method.getDeclaredAnnotations()) {
          System.out.println('Annotation in Method ''+ method + '' : ' + anno);
          }
        MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
        if (methodAnno.revision() == 1) {
          System.out.println('Method with revision no 1 = '+ method);
          }
 
      } catch (Throwable ex) {
          ex.printStackTrace();
          }
    }
  }
  } catch (SecurityException | ClassNotFoundException e) {
      e.printStackTrace();
     }
  }
 
}

运行上面程序将输出:

Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest
 



以上就是java 自定义注解的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java自定义注解  # Java自定义注解的详解  # java自定义注解接口实现方案  # 创建自定义的Java注解类的方法  # Java 自定义注解的魅力  # Java注解Annotation与自定义注解详解  # javaSE基础java自定义注解原理分析  # 自定义  # 或者是  # 内建  # 类中  # 推荐使用  # 当我们  # 我们应该  # 过程中  # 作用于  # 在这个  # 不言自明  # 如有  # 我们可以  # 可以通过  # 也将  # 希望能  # 此类  # 三种  # 将被  # 仅仅是 


相关文章: rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  ,巨量百应是干嘛的?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何在阿里云服务器自主搭建网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  南京网站制作费用,南京远驱官方网站?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  宁波免费建站如何选择可靠模板与平台?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  建站之星展会模版如何一键下载生成?  制作网站公司那家好,网络公司是做什么的?  建站之星图片链接生成指南:自助建站与智能设计教程  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何在阿里云购买域名并搭建网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何通过PHP快速构建高效问答网站功能?  家具网站制作软件,家具厂怎么跑业务?  建站之星价格显示格式升级,你的预算足够吗?  网站制作网站,深圳做网站哪家比较好?  网站制作公司,橙子建站是合法的吗?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  建站之星后台密码遗忘如何找回?  如何快速启动建站代理加盟业务?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何快速搭建高效服务器建站系统?  音乐网站服务器如何优化API响应速度?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  做企业网站制作流程,企业网站制作基本流程有哪些?  七夕网站制作视频,七夕大促活动怎么报名?  如何彻底卸载建站之星软件?  b2c电商网站制作流程,b2c水平综合的电商平台?  公司门户网站制作流程,华为官网怎么做?  PHP 500报错的快速解决方法  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  电商网站制作公司有哪些,1688网是什么意思?  如何通过.red域名打造高辨识度品牌网站?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  seo网站制作优化,网站SEO优化步骤有哪些?  图册素材网站设计制作软件,图册的导出方式有几种?  建站之星代理如何优化在线客服效率?  网站网页制作专业公司,怎样制作自己的网页?  如何通过虚拟主机快速完成网站搭建?  建站之家VIP精选网站模板与SEO优化教程整合指南  香港服务器部署网站为何提示未备案?  网站制作模板下载什么软件,ppt模板免费下载网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何通过智能用户系统一键生成高效建站方案?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Java解压缩zip - 解压缩多个文件或文件夹实例  魔毅自助建站系统:模板定制与SEO优化一键生成指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。