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面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java外围知识点总结!

这些材料的内容都是面试时面试官必问的知识点,篇章包含了很多知识点,其中包含了有基础知识、Java汇合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。