【java】细说 JAVA中 标注 注解(annotation)

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用

下面我们来详细说说这个注解,到底是怎么一回事,一步一步看下去,总会后收获。

注解起源:Annotation(注解)是JDK5.0及以后版本引入的。在java.lang.annotation包中。

注解作用:它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。

注解格式:注解是以‘@注解名’在代码中存在的

注解分类:标记注解、单值注解、完整注解三类

另外:它都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。

元注解说,我先来上阵-----

------------------------------main-----------------------------------

一、元注解:

元注解功能:就是对其他注解进行注解。

我们它的功能划分为三类:

  编写文档:通过代码里标识的元数据生成文档;

  代码分析:通过代码里标识的元数据对代码进行分析;

  编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

元注解包括:@Retention @Target @Document @Inherited四种。



@Target 注解:

---------------------------------------------------

@Target解释:

  @Target说明了Annotation所修饰的对象范围:

    Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。

    在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

@Target作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

@Target 的java源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

  备注:先解释一下 interface 表示接口,而@interface表示annotation

——————————————————————————

ElementType取值:

    通过源码可以看到,ElementType ,它的取值有:

    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

------------------------------------------------

实例: (我们自定义了两个自定义注解,按照上面我们给出的取值含义,@table将会用于类、接口或enum声明)

@Target(ElementType.TYPE)
public @interface Table {
    /**
     * 数据表名称注解,默认值为类名称
     * @return
     */
    public String tableName() default "className";
}

@Target(ElementType.FIELD)
public @interface NoDBColumn {

}

那么到这里,我们的@Target 元注解解释完毕,有不明白地方, @企鹅:2783309477



 @Retention注解:

@Retention 精简解释:

  就是对自定义注解的生命周期的管理

@Retention 详细解释:

  @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而 被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将 被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制

——————————————————————————————

@Retention: 定义注解的保留策略

  @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含

  @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

  @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

——————————————————————————————

@Retention java源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

  通过源代码可以看到RetentionPolicy可取值。那么接下来

———————————————————————————————

@Retention  取值:

  RetentionPolicy可取值:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

@Retention 实例:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField";
    public boolean defaultDBValue() default false;
}

备注:也同样,可以看出来,Column将会有在运行时有效范围。

  一般格式:

  @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含

  @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,

  @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

  OK,这个就解释到这里,有不明白 @小企鹅:2783309477(如是),接下来



@Documented 元注解:

  @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,

  因此可以被例如javadoc此类的工具文档化。

  Documented是一个标记注解,没有成员。

@Document java源码:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Document 实例:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField";
    public boolean defaultDBValue() default false;
}

@Inherited 元注解:

  

@Inherited 解释:

  是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。

  也就是说,如果被它修饰的annotation类型用在一个类上面,这个annotation 将被用在子类中。

  注意:

    1、@Inherited annotation类型是被标注过的class的子类所继承。

      类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

    2、当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,

      则反射API增强了这种继 承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation

      类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型

      被发现, 或者到达类继承结构的顶层。


未完待续(自定义注解/默认注解/...)

时间: 2024-08-24 17:30:39

【java】细说 JAVA中 标注 注解(annotation)的相关文章

java中的注解(Annotation)

转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到源代码中使用其他工具可以对其进行处理的标签.注解不会改变程序的编译方式.java编译器会对包含注解与不包含注解的代码生成相同的虚拟机指令.在java中,注解是被当做修饰符(如public/static之类)来使用的. 注解与注释 注释是供人看的,注解是供程序调用的.一种是程序员写给另一个程序员的,一

spring中自定义注解(annotation)与AOP中获取注解

一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. package me.lichunlong.spring.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.R

java源码中的注解

spring框架源码中充满了注解,如果对注解不是很了解,阅读源码就寸步难行,下面我们来看看annotation.https://blog.csdn.net/briblue/article/details/73824058,这篇文章虽然有点长,但是基本都讲到了.当开发者使用了Annotation 修饰了类.方法.Field 等成员之后,这些 Annotation 不会自己生效,必须由开发者提供相应的代码来提取并处理 Annotation 信息,这就是annotation的原理,给开发者提供了很大创

Java中的注解的详解

详解Java中的注解 在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行. 注解可以做什么 Java中的注解通常扮演以下角色: 编译器指令 构建时指令 运行时指令 l Java内置了三种编译器指令,本文后面部分会重点介绍 l Java注解可以应用在构建时,即当你构建你的项目时.构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等.软件的构建通常使用诸如A

【java】java中的注解(Annotation)是如何工作的?

Java中的注解是如何工作的? 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架).这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧. 什么是注解? 用一个词就可以描述注解,那就是元数据,即

JUnit 4 使用 Java 5 中的注解(annotation)

JUnit 4 使用 Java 5 中的注解(annotation),以下是JUnit 4 常用的几个 annotation 介绍@Before:初始化方法@After:释放资源@Test:测试方法,在这里可以测试期望异常和超时时间@Ignore:忽略的测试方法@BeforeClass:针对所有测试,只执行一次,且必须为static void@AfterClass:针对所有测试,只执行一次,且必须为static void一个JUnit 4 的单元测试用例执行顺序为:@BeforeClass –>

java基础篇---注解(Annotation)

一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联.更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中. java.lang.annotation.

java 注解Annotation

什么是注解? 注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的. java注解又叫java标注,java提供了一套机制,使得我们可以对方法.类.参数.包.域以及变量等添加标准(即附上某些信息).且在以后某个时段通过反射将标注的信息提取出来以供使用. 通过使用Annotation,程序开发人员可以在不改变的原有逻辑的情况下,在源文件嵌入一些补充的信息. Annotation可以用来修饰类.属性.方法,而且Annotation不影响程序

Java反射学习总结五(Annotation(注解)-基础篇)

Annotation(注解)简单介绍: 注解大家印象最深刻的可能就是JUnit做单元測试,和各种框架里的使用了. 本文主要简介一下注解的用法,下篇文章再深入的研究. annotation并不直接影响代码语义.可是它可以被看作类似程序的工具或者类库.它会反过来对正在执行的程序语义有所影响. annotation能够从源文件,class文件或者以在执行时反射的多种方式被读取 java注解系统自带有主要下面几个注解: Override注解表示子类要重写(override)父类的相应方法 Depreca