博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
注解开发
阅读量:6161 次
发布时间:2019-06-21

本文共 2843 字,大约阅读时间需要 9 分钟。

注解不仅包含了元数据,它还可以作用于程序运行过程中、注解解释器可以通过注解决定程序的执行顺序
 
Java提供了三种内建注解
  1. @Override - 标注在方法上 , 表示该方法是用于重写 , 非重写则报错
  2. @Deprecated - 标注在方法上 , 表示该方法已过时 , 不推荐使用 , 但仍然是可以使用的
  3. @SuppressWarnings - 告诉编译器忽略特定的警告信息
 
创建自定义注解和创建一个接口类似 , 但是要在interface前面加上@符号
注解的定义有一些限制
  • 注解方法不能带参数
  • 注解方法的返回值类型可以是 : 基本类型 , String , Enums , Annotation 或者是这些类型的对应数组
以下面这个
注解定义的为例
1 @Documented//拥有这个注解的元素可以被javadoc文档化 2 @Target(ElementType.METHOD) 3 //该注解可以注解的程序元素返回,不添加则表示可以注解任何程序元素 4 @Inherited//该注解类型被自动继承 5 @Retention(RetentionPolicy.RUNTIME) 6 //指明该注解被保留的时间长短 7 public @interface InfoMethod { 8      String author() default "sookie" ; 9      String date();10      int version() default 1;11      String comments();12 }

 

从中可以看出注解还具备一些特性
  • 注解方法可以有默认值
  • 注解本身能够包含元注解 , 元注解是可以被用来注解其他注解的
    ( 上述的Documented , Target , Inherited , Retention就是元注解 , 仅此4种 )
 
这里需要提一下的是 java.lang.annotation.Annotation 接口
它是所有注解类型都需要扩展的公共接口 , 但手工扩展该接口并不能定义注解
一个注解本身也相当于一个接口
其对象是一个代理类的对象 , 将在下面的反射解析注解中看到
 
注解使用
public class Test {     @Override     @InfoMethod(author= "22",comments="Main method",date="2016-02-04")     //存在默认值的注解方法,使用时可以不传值,其余都要传值     public String toString(){           return "Overriden toString method" ;     }          @Deprecated     @InfoMethod(author= "33",comments="Deprecated method",date="2016-02-16")     public static void oldMethod (){          System. out.println("该方法已过时" );     }          @SuppressWarnings({ "unchecked", "rawtypes" })     @InfoMethod(comments= "SuppressWarnings method",date="2016-02-16")     public static void genericsTest(){          List list = new ArrayList();          list.add( "OK");           oldMethod();     }}

 

注解的解析
 
使用Java的反射机制来解析类当中的注解
@Retention必须被设置为 RUNTIME , 否则注解信息在执行过程中将不可用
所以也就不能从中得到任何与注解有关的数据
 
public static void main(String[] args) throws Exception{          Class
cls = (Class
) Test. class; for(Method method : cls.getDeclaredMethods()){ //获取到该类中的所有方法(不包括继承的)并执行遍历 if(method.isAnnotationPresent(InfoMethod.class)){ //如果指定类型的注解存在于此元素上 for(Annotation anno : method.getAnnotations()){ System.out.println(method.getName()+"方法上的注解有" +anno); } InfoMethod methodAnno = method.getAnnotation(InfoMethod.class); //获取到该方法上的InfoMethod注解对象 System.out.println("--author:" +methodAnno.author()); System.out.println("--date:" +methodAnno.date()); System.out.println("--comments:" +methodAnno.comments()); } }}

 

执行结果如下
可以发现除了我们自定义的注解@InfoMethod之外
只有@Deprecated被获取到了
分别去找 @Override和@SuppressWarnings 的源代码可以发现 
 
他们的保留时间都不是 RUNTIME
  • SOURCE - 注解仅存在于源码中
  • CLASS - 注解会在class字节码文件中存在 , 但运行时无法获得
  • RUNTIME - 注解会在class字节码文件中存在 , 运行时可以通过反射获得
 
补充说明 : 
getAnnotations 方法在Field  Method  Class 类当中都存在
可以获取添加在属性  方法  类之上的注解 

转载于:https://www.cnblogs.com/programInit/p/6363115.html

你可能感兴趣的文章
iOS开发之通过代理逆向传值
查看>>
每天学点SpringCloud(八):使用Apollo做配置中心
查看>>
Jmockit单元测试MockUp调用原始方法
查看>>
顺风车Android性能优化之View布局优化
查看>>
Windows 7 延长支持服务价格曝光:一台电脑最低25美元
查看>>
谷歌发布自然问答数据集 Natural Questions
查看>>
高通-物理专线2.0新版资费计划
查看>>
Python3基础——字典、其他常用操作
查看>>
Jenkins 教程(一)实现自动化打包及邮件通知
查看>>
敬业签电脑手机云同步便签及安卓手机和苹果手机云同步桌面便签
查看>>
六大核心!突破自动驾驶和智慧交通的必由之路
查看>>
数据科学即将迎来“无代码”时代
查看>>
阿里云成立技术脱贫联盟,要用技术助力脱贫
查看>>
区块链项目开发最容易受区块链技术影响的行业
查看>>
阿里云HBase发布冷存储特性,助你不改代码,1/3成本轻松搞定冷数据处理
查看>>
gulp.js 4.0试用
查看>>
Github 是如何用 Github 撰写 Github 文档的
查看>>
Javascript鸡汤
查看>>
[计算机网络] - 从英雄联盟,看数据包何去何从?
查看>>
CakePHP 3.7.6 发布,PHP 快速开发框架
查看>>