详解Java注解教程及自定义注解

更新时间:2016-02-26 11:47:06   作者:佚名   我要评论(0)

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() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)

这就是该教程的全部内容,希望你可以从中学到些东西。

相关文章

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

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

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

最新评论

java注解 源码_详解Java注解教程及自定义注解相关推荐

  1. java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  2. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

  3. java 线程一直运行状态_详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在. 一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源.更加轻量化,也因 ...

  4. java的自动装箱_详解Java 自动装箱与拆箱的实现原理

    详解Java 自动装箱与拆箱的实现原理 发布于 2020-7-4| 复制链接 本篇文章主要介绍了详解Java 自动装箱与拆箱的实现原理,小妖觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小妖 ...

  5. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  6. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  7. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  8. java集合for循环_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  9. java访问本地文件_详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相 ...

最新文章

  1. commonjs是什么_第一步:面试官让我解释什么是Common.js和ES6模块化
  2. 在Pycharm编辑器中调用getpass模块
  3. 文件内容统计——Linux wc命令
  4. oracle里面有emp表么,Oracle自带表(EMP)SQL语句练习
  5. 《MacTalk·人生元编程》
  6. windows驱动程序编写_如何在Windows中回滚驱动程序
  7. IOS之提示Interface type cannot be statically allocated
  8. TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项
  9. Java 项目 接口开发规范
  10. 和yupeng的讨论
  11. vscode + SFTP 传输文件到服务器,从服务器下载文件
  12. JMETER从数据库获取数据作为脚本参数
  13. python中pandas库里的read_table和read_csv的区别
  14. 实现图片抠图,拖拽验证功能
  15. 数据库知识与技巧日常汇总
  16. 地方旅游网站源码,PHP开源,PC+WAP+微信三合一,免费分享
  17. Linux网络编程:状态机
  18. 【React】利用Dooringx快速制作H5搭建平台
  19. python数据按照分组进行频率分布_python实现读取类别频数数据画水平条形图案例...
  20. 天津师范大学计算机与信息工程学院研究生院,天津师范大学计算机与信息工程学院2020考研调剂信息...

热门文章

  1. 超值一篇分享,Docker:从入门到实战过程全记录
  2. 新云网、5G、Wi-Fi 6 Plus,探秘2021通信展上的锐捷网络黑科技
  3. 北森完成2.6亿美金融资,一体化×低代码引领HR数字化风潮
  4. 云原生时代老牌IDC巨头谋求转型,世纪互联成立新品牌“互联科技(NEOLINK)”
  5. 语法糖 python_Python___语法糖
  6. linux+oracle+自动增量备份脚本,linux自动运行rman增量备份脚本
  7. 12123两小时没付款怎么办_机械厂上班的男朋友,一天十小时,周末不休,没时间陪我怎么办?...
  8. 查询字段是date类型的数据
  9. centos7 /etc/profile 文件模板
  10. 第8篇:Flowable-Modeler集成之Flowable-modeler源码编译