专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 技术分析之Java注解之基本原理介绍

技术分析之Java注解之基本原理介绍

更新时间:2020-07-28 16:49:33 来源:动力节点 浏览1815次

一.注解的本质

「java.lang.annotation.Annotation」接口中有这么一句话,用来描述『注解』。

The common interface extended by all annotation types

所有的注解类型都继承自这个普通的接口(Annotation)

这句话有点抽象,但却说出了注解的本质。我们看一个JDK内置注解的定义:

 Target(ElementType.METHOD)
 Retention(RetentionPolicy.SOURCE)
public interface Override{
}

这是注解 Override的定义,其实它本质上就是:

public interface Override extends Annotation{
}

没错,注解的本质就是一个继承了Annotation接口的接口。有关这一点,你可以去反编译任意一个注解类,你会得到结果的。

一个注解准确意义上来说,只不过是一种特殊的注释而已,如果没有解析它的代码,它可能连注释都不如。

解析一个类或者方法的注解往往有两种形式,一种是编译期直接的扫描,一种是运行期反射。

二.元注解

『元注解』是用于修饰注解的注解,通常用在注解的定义上。

JAVA中有以下几个『元注解』:

 Target:注解的作用目标

 Retention:注解的生命周期

 Documented:注解是否应当被包含在JavaDoc文档中

 Inherited:是否允许子类继承该注解

1. Target

 Target注解指明该注解可以作用哪些对象上。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
        * Returns an array of the kinds of elements an annotation type
        * can be applied to.
        * @return an array of the kinds of elements an annotation type
        * can be applied to
        */
    ElementType[] value();
}

注解接收一个ElementType数组,ElementType是一个枚举,成员如下:

ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上

ElementType.FIELD:允许作用在属性字段上

ElementType.METHOD:允许作用在方法上

ElementType.PARAMETER:允许作用在方法参数上

ElementType.CONSTRUCTOR:允许作用在构造器上

ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上

ElementType.ANNOTATION_TYPE:允许作用在注解上

ElementType.PACKAGE:允许作用在包上

ElementType.TYPE_PARAMETER:允许作用在类型参数上

ElementType.TYPE_USE:允许作用在类型上

2. Retention

 Retention用于指明当前注解的生命周期

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
        * Returns the retention policy.
        * @return the retention policy
        */
    RetentionPolicy value();
}

注解接收一个RetentionPolicy数据,RetentionPolicy是个枚举,成员如下:

RetentionPolicy.SOURCE:当前注解编译期可见,不会写入class文件

RetentionPolicy.CLASS:类加载阶段丢弃,会写入class文件

RetentionPolicy.RUNTIME:永久保存,可以反射获取

三.Java的内置三大注解

 Override

 Deprecated标识类或方法不再推荐使用

 SuppressWarnings主要用来压制java的警告

四.实现一个自己的注解

定义一个注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HelloAnnotation {
    String value() default "Hello annotation!";
}

使用这个注解:

public class UseAnnotation {
    @HelloAnnotation
    public void hello() {
        System.out.println("hello");
    }

    @HelloAnnotation("Hello world!")
    public void helloWorld() {
        System.out.println("Hello world!");
    }
}

注解最重要的部分在于对注解的处理。注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。如果没有注解处理器,注解就是个注释,或者连注释都不如。

处理这个注解:

public class Test {
    public static void main(String[] args) {
        testAnnotation(UseAnnotation.class);
    }
    private static void testAnnotation(Class cl) {
        for (Method m : cl.getDeclaredMethods()) {
            HelloAnnotation ha = m.getAnnotation(HelloAnnotation.class);
            if (ha != null) {
                System.out.println("Found My Annotation: " + ha.value());
            }
        }
    }
}

输出结果:
Found My Annotation: Hello annotation!
Found My Annotation: Hello world!

什么是Java注解:http://www.bjpowernode.com/tutorial_java_advance/1055.html

以上就是动力节点java培训机构的小编针对“技术分析之Java注解之基本原理介绍”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>