北京快3手机版:举例讲解JDK注解的使用和自定义注解的方法

北京快三走势图 www.mxld9.cn  更新时间:2019年03月12日 16:11:19   作者:Melissa_hexiu   我要评论

今天小编就为大家分享一篇关于举例讲解JDK注解的使用和自定义注解的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

JDK中的三个基本注解

a、@Override:检查子类确实是覆盖了父类的方法。
b、@Deprecated:说明已经过时了。
c、@SuppressWarnings({ "unused", "deprecation" }):抑制程序中的警告。unused警告的类型。{}数组。all抑制所有警告。

简单使用:

public class Demo1 {
  //@SuppressWarnings({ "deprecation", "unused" })
  @SuppressWarnings("all")
  public void fun()
  {
    int i = 5;
    System.out.println("hello");
    System.out.println(new Date().toLocaleString());
  }
}
class Tests extends Demo1
{
  @Override
  public void fun()
  {
    super.fun();
  } 
  @Deprecated
  public void tt()
  {
    System.out.println(new Date().toLocaleString());
  }
}

声明一个注解 @interface 注解名{}

public @interface MyAnnotation{}

注解它的本质就是一个接口,这个接口需要继承 Annotation接口。

public interface MyAnnotation extends java.lang.annotation.Annotation {
}

注解的属性类型:

  •     1.基本类型
  •     2.String
  •     3.枚举类型
  •     4.注解类型
  •     5.Class类型
  •     6.以上类型的一维数组类型

具体是怎样定义的呢,我们看代码:

public @interface MyAnno1 {
  //注解中定义的都是属性
  int age() default 20;
  String[] name() default "hehe";
  String value() default "haha";
  Love love();
  //MyAnno2 anno();
  //public static final int num = 5;//可以
  //public abstract void fun();//error
}

使用自定义注解:

public class Demo2 {
  //@MyAnno1(age=25,name={"jack","lucy"},value="zhengzhi")
  //@MyAnno1(value="zhengzhi")
  @MyAnno1(value="zhengzhi",love=Love.eat)
  public void tests()
  {
  }
}

如果在没有默认值的情况下,使用自定义注解我们需要设置注解中属性的值。

注解的反射:(灵魂)

模拟Junit的@Test
a、反射注解类
java.lang.reflect.AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。
Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。
Annotation[] getDeclaredAnnotations():得到自己身上的注解。
boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。
Class、Method、Field、Constructor等实现了AnnotatedElement接口.
如果:Class.isAnnotationPresent(MyTest.class):判断类上面有没有@MyTest注解;
Method.isAnnotationPresent(MyTest.class):判断方法上面有没有@MyTest注解。

下面通过代码实现一下。

我们模拟实现@Test注解的功能

首先这是我们的注解@MyTest

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//元注解: 用来注解注解的
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
  long timeout() default Integer.MAX_VALUE;//设置超时时间的
}

这是我们使用注解的类:

public class DBCRUD {
  @MyTest(timeout=1000000)
  public void addTest()
  {
    System.out.println("addTest方法执行了");
  }
  @MyTest
  public void updateTest()
  {
    System.out.println("updateTest方法执行了");
  }
}

当我们使用了注解,我们就需要判该类是否使用了注解,我们通过反射来实现。

private static void method1() throws IllegalAccessException,
    InvocationTargetException, InstantiationException {
    Class claz = DBCRUD.class;//得到字节码文件对象
    //得到该类及父类中的所有方法
    Method[] methods = claz.getMethods();
    for(Method m:methods){
      //判断方法是否使用了@MyTest这个注解
//     boolean boo = m.isAnnotationPresent(MyTest.class);
//     System.out.println(m.getName()+"===="+boo);//都是false 默认注解存活到 CLASS,改变存活到RUNTIME
      if(m.isAnnotationPresent(MyTest.class)){
        m.invoke(claz.newInstance(), null);
      }
    }
  }

这里我们需要注意的是,我们需要考虑到自定义注解的存活范围。

默认的自定义注解只存活到编译时期,class阶段。

可以注意到,我们上面的自定义注解应用了@Retention注解,这个注解就是改变自定义注解的存活范围。

这个注解也叫做元注解,只能用在注解上的注解叫做元注解。

上面的method方法没有考虑到超时的问题,下面我们再完善一下。

//method1();
    //反射解析注解的属性
    Class claz = DBCRUD.class;
    Method[] methods = claz.getMethods();
    for(Method m:methods){
      //从该方法上获取MyTest注解
      MyTest mt = m.getAnnotation(MyTest.class);
      if(mt!=null){
        //得到注解中的属性
        long out = mt.timeout();
        long start = System.nanoTime();
        m.invoke(claz.newInstance(), null);
        long end = System.nanoTime();
        if((end-start)>out)
        {
          System.out.println("运行超时");
        }
      }
    }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java获取随机数的3种方法

    Java获取随机数的3种方法

    本篇文章主要介绍了Java获取随机数的3种方法,现在分享给大家,也给大家做个参考,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • btrace定位生产故障的方法示例

    btrace定位生产故障的方法示例

    这篇文章主要介绍了btrace定位生产故障的方法示例,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • 进一步理解Java中的多态概念

    进一步理解Java中的多态概念

    这篇文章主要介绍了进一步理解Java中的多态概念,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • 详解Java编程中JavaMail API的使用

    详解Java编程中JavaMail API的使用

    这篇文章主要介绍了详解Java编程中JavaMail API的使用,通过JavaMail可以实现丰富的邮件类相关功能,需要的朋友可以参考下
    2015-11-11
  • java在网页上面抓取邮件地址的方法

    java在网页上面抓取邮件地址的方法

    这篇文章主要介绍了java在网页上面抓取邮件地址的方法,是比较典型的Java正则匹配应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • SSH框架网上商城项目第27战之申请域名空间和项目部署及发布

    SSH框架网上商城项目第27战之申请域名空间和项目部署及发布

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第26战之申请域名空间和项目部署及发布,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java TreeMap排序算法实例

    Java TreeMap排序算法实例

    这篇文章主要介绍了Java TreeMap排序算法,结合实例形式分析了TreeMap排序算法的原理、实现方法与相关注意事项,需要的朋友可以参考下
    2017-07-07
  • java 1.8 动态代理源码深度分析

    java 1.8 动态代理源码深度分析

    下面小编就为大家带来一篇java 1.8 动态代理源码深度分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 详解Java的Struts框架中注释的用法

    详解Java的Struts框架中注释的用法

    这篇文章主要介绍了详解Java的Struts框架中注释的用法,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Spring Boot Maven插件使用详解

    Spring Boot Maven插件使用详解

    这篇文章主要为大家详细介绍了Spring Boot Maven插件使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论

  • 解说米勒谈WE:LPL夏季赛夺冠可能性不大 2019-05-23
  • 陈坤:虽然会被困扰,但感谢情绪无法删除 2019-05-22
  • 问题来了!那些年你遇到的噪声扰民怎么办? 2019-05-21
  • 俞正声:广泛开展对外友好交往 2019-05-21
  • 运用互联网思维介入城市化会如何? 2019-05-20
  • 【加拿大房产网加拿大新房加拿大房产信息网】 2019-05-20
  • 银保监会新规剑指大企业多头融资和过度融资 2019-05-19
  • [网连中国]5地社保费率降低后工资条看变化 职工:只少交几块钱 2019-05-19
  • 全国政协委员侯一筠:发挥山东海洋优势,打造国家级科技成果转化平台 2019-05-18
  • 广西河池消防支队召开新兵第二阶段集训工作部署会 2019-05-18
  • 龙峰:帮助更多企业用好互联网—上游新闻对话重庆经济 2019-05-17
  • 其实,生产力发展了,社会财富丰富了,把小萌们养起来也不是什么问题……但你们不能被养着还养出脾气来还妄图对真正的劳动者指手画脚! 2019-05-16
  • 全国人大代表、三角轮胎董事长丁玉华去世 2019-05-15
  • 省国资委党委召开省属企业党风廉政建设和反腐败工作会议 2019-05-14
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-05-14
  • 668| 307| 215| 401| 670| 997| 307| 113| 894| 896|