数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

排列七走势图:举例讲解JDK注解的使用和自定义注解的方法

来源:脚本之家  责任编辑:小易  

河北20选五开奖结果 www.vhmyd.cn 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("运行超时");
        }
      }
    }

总结

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

您可能感兴趣的文章:


  • 本文相关:
  • spring aop中的jdk和cglib动态代理哪个效率更高?
  • jdk动态代理与cglib动态代理的区别对比
  • linux centos安装jdk和tomcat的教程
  • 浅析jdk和tomcat的安装与配置方法
  • java jdk8 list获取属性列表
  • java jdk8 list分组获取第一个元素的方法
  • java jdk8 list分组的实现和用法
  • java基于jdk 1.8的linkedlist源码详析
  • studio 编译报错:compilesdkversion ''android-24'' requires jdk 1.8 or later to compile.的解决办法
  • 解决myeclipse中maven设置jdk版本jdk1.8报错问题
  • 计算一个java对象占用字节数的方法
  • java 算法之归并排序详解及实现代码
  • 详解spring retry实现原理
  • java网络编程基础教程之socket入门实例
  • java log4j详细教程
  • java 中newinstance()方法和new关键字的区别
  • java文件读取写入后 md5值不变的实现方法
  • 常见的java面试题
  • 最小树形图模板朱刘算法分享
  • java构造器使用方法及注意事项
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 河北20选五开奖结果 - 频道导航
    Copyright © 2017 河北20选五开奖结果 www.vhmyd.cn All Rights Reserved
  • 王一彪:为新时代“双一流”建设提供舆论支持 2019-03-20
  • 傅抱石《琵琶行诗意》1.035亿元成交 2019-03-19
  • 国地税怎么又合并了呢 一般来看 这是种集中资源的举动 2019-03-19
  • 中考期间 太原27个公共自行车服务点有人值守 2019-03-18
  • 美媒:美国“伪专家”太多,妨碍美对华关系 2019-03-18
  • “公路挤成步行街”端午假期超944万人次打卡“网红”重庆 2019-03-18
  • 中国经济稳步迈向高质量 2019-03-17
  • 阳泉发现一枚疑似炮弹 警方迅速处置 2019-03-17
  • 临汾市公开曝光5起违反中央八项规定精神问题 2019-03-17
  • 那你说说看,哪个国家什么时候是由劳动者主导的?[哈哈] 2019-03-16
  • 云南:玉溪市红塔区率先推行“互联网+政务服务”新模式 2019-03-16
  • 就因为“阶级亲”,才应把这些难民送到欧洲。欧洲生活水平高呀,让亲人生活的更好。不能让他们到中国受苦受难呀。 2019-03-16
  • 韩国提高最低工资再起争议 负面影响引发争论 2019-03-15
  • 十年长出一座绿色新城(在习近平新时代中国特色社会主义思想指引下——新时代新作为新篇章) 2019-03-15
  • 暖心!宝宝看餐厅海报  有爱餐厅送上美食 2019-03-15
  • 823| 625| 701| 839| 927| 366| 612| 159| 744| 505|