HappyBKs教你写Java注解(1)——注解的分类、运行机制、作用域及概念汇总

注解这东西,已经在我们的编程生活中习以为常了。覆盖一个父类的方法,套用Spring、Mybatis中的编程套路,编写JUnit测试函数等等。你会发现,作为一个Java Coder,你无时无刻不在接触它们。

但是如何编写一个属于自己的注解,或是希望能够看懂那些NB框架的源代码,都有必要让你我去掌握编写自定义注解的方法。

本系列开始,我将和博客的观众们一起学习java注解的开发。

注解分类(按照来源来分)

jdk中的注解:

@Override 重写父类的方法。如果父类没有该方法则编译报错

	@Override
	public String toString() {
		return "Member [id=" + id + ", familyName=" + familyName
				+ ", givenName=" + givenName + ", salary=" + salary + "]";
	}

@Deprecated 以前的定义的类或方法,大家正用得high,你却觉得好像这样设计并不好,于是加入了新的类或方法来代替它们。但是,这样做,以前的小伙伴们又要抱怨了,"你这个前后版本不兼容"云云,所以我们需要用一个注解指明"存在但已过时,可用但不推荐”,这就是@Deprecated。

比如,由于现在的猫都不捉老鼠了,所以,下面这个方法,我决定废弃。但是以前已经有太多围绕猫的方法调用了,所以我加入了注解@Deprecated。IDE中的删除线就是醒目的标识。

哎呀呀,好像调用注解了@Deprecated的方法之后,出现了warning!

HappyBKs我是个代码洁癖,一定要把这个警告去掉。

类似的我们编写代码的过程中,往往不可避免了会出现一些警告,有些我们可以根据好的范式、好的习惯、好的经验把这些代码重新修改消除警告。但是有时一些场景,似乎要求我们包容他们。怎么办呢?这时候,可以用@SuppressWarnings注解,消除相应警告类型。

比如上面的调用废弃方法产生的警告,我们可以改成这样:

现在警告没有了!: )

第三方注解: 

如果你是一个java框架的达人,一定知道spring额@Autowired自动创配,以及@Service和@Repository;也一定会用Mybatis的@InsertProvider,@UpdateProvider,@Option。

作为用框架的人,少不了和这些第三方注解打交道。这里就不介绍框架了。

自定义的注解:

如果我们想读懂别人的代码、自己尝试着写一下框架、装装B格,那么自己写一个注解是必不可少的。这也是本系列文章的目标!!

其实要有一类比较特殊的注解,不知道该把它按照哪个范畴进行划分,那就是元注解。

元注解:指的是注解的注解。就像元数据是描述数据的数据一样。具体的我会单独在一篇文章中介绍。

注解的运行机制、作用域、继承性等:

我门对注解进行分类,还可以按照运行机制分类

注解的运行机制:

按照这个运行机制的不同,我们可以将注解分成三类:

源码注解: 注解只在源码中存在,编译成.class文件就不存在了。

编译时注解:注解在.class文件里面存在。当然在.class文件中存在,在源码当中当然也是存在的。刚才说的3个jdk自带的注解@Deprecated 、@SuppressWarnings、@Override都属于编译时注解。也正因为如此,当你@Override了父类不存在的方法,编译时编译器会报错;调用@Deprecated的方法,编译器会警告。IDE才能在编辑代码时实时提示错误。

运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。

如何指定一个注解的运行机制:(即影响的时间点)

我们在定义一个注解时,还需要指明它是源码注解、编译时注解还是运行时注解。这里也需要用到一个枚举:

/*
 * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package java.lang.annotation;

/**
 * Annotation retention policy.  The constants of this enumerated type
 * describe the various policies for retaining annotations.  They are used
 * in conjunction with the {@link Retention} meta-annotation type to specify
 * how long annotations are to be retained.
 *
 * @author  Joshua Bloch
 * @since 1.5
 */
public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

注解的作用域:

注解的作用域指的是一个注解修饰的是什么语法单元。注解标识的是一个类,一个方法,一个域,一个构造器等等。这里在指定注解的作用域时会用到一个枚举来指定作用域的类型,这里我把jdk的源码列出:

package java.lang.annotation;

/**
 * A program element type.  The constants of this enumerated type
 * provide a simple classification of the declared elements in a
 * Java program.
 *
 * <p>These constants are used with the {@link Target} meta-annotation type
 * to specify where it is legal to use an annotation type.
 *
 * @author  Joshua Bloch
 * @since 1.5
 */
public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}

注解的继承性:

规定了一个注解在标注了一个类、接口或方法等之后是否会在所在类的子类中生效。这个我会在本系列后面的文章中单独写一篇介绍。

注解输出到文档:

这个就是@Docmented注解,指定注解是否被输出到java文档中。

Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。

具体如何写一个自己的注解。放到下一篇文章中写吧。

时间: 2024-11-05 19:39:49

HappyBKs教你写Java注解(1)——注解的分类、运行机制、作用域及概念汇总的相关文章

Java并发编程(02):线程核心机制,基础概念扩展

本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个基础的演示案例. 2.应用案例 场景:假设有一个容器集合,需要拿出容器中的每个元素,进行加工处理,一般情况下直接遍历就好,如果数据偏大,可以根据线程数量对集合切割,每个线程处理一部分数据,这样处理时间就会减少很多. public class ExtendThread01 { publ

Java高级之注解、反射

Java的注解.反射等机制的产生,让动态代理成为可能,一般通过全限定名+类名,找到类,可以invoke它的构造方法以及其他方法,可以获取它的参数(Field)名称和值. 注解一般用在代码的注释上.代码审查上(有没有按标准写,比如inspect).代码注入(hook,asbectj),需要考虑的是,在何时注入(编译期还运行期) 反射一般用在动态将json和Object互相转化,执行相关底层代码,比如设置某个类的Accessible为false,防止别人hook修改 例:阿里的FastJson解析:

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

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

Java学习系列(二十一)Java面向对象之注解详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45295947 一.前言 Java中的注解Annotation运用到很多方面,比如之前讲的单元测试中的@Test.Spring.SpringMVC还有其他框架等等.Java本身自带的注解也有一些,比如:@Override(子类要重写/覆写父类的对应方法).@Deprecated(表示方法不建议被使用).@SuppressWarnings(抑制警告)等等.当然,我们也可以自定义一些自己需要的

java中的注解(Annotation)

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

Java编译时注解自动生成代码

在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解.注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具.可以为特定的注解,注册自己的注解处理器. 一个注解的注解处理器,以Java代码(或者编译过的字节码)作为输入,生成文件(通常是.java文件)作为输出.可以生成Java代码,这些生成的Java代码是在生成的.java文件中,所以不能修改已经存在的Java类,例如

Java:自定义注解(Annotation)

在网上找了很多资料也有写的比较好的,但是总有有一点半点的细节没有写出来,在这里自己总结下使用. 使用Java的自定义注解,首先个人需要了解下Java为我们提供的元注解和相关定义注解的语法.(这个我在网上选择了一篇详细的介绍链接在文章最底层) 1.首先自定义我们需要的注解 package com.plat; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lan

深入浅出Java Annotation(元注解和自定义注解)

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

java高级特性--注解,这也许是最简单易懂的文章了

博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘QAQ.本篇文章中我将结合实际的应用场景尽可能由浅入深,平缓的介绍java注解. java注解是jdk1.5以后新出的特性,对于它的应用非常广泛,我们首先来看一下注解的应用,百度百科上这样说: 我们可以看到,注解的作用有三方面: 编写doc文档:这个就我们很常用的 @return 以及 @author,加了这些注解以后,就可以用jdk帮我们自动生成对应的API