文档章节

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

HappyBKs
 HappyBKs
发布于 2015/09/07 14:54
字数 1557
阅读 685
收藏 5

注解这东西,已经在我们的编程生活中习以为常了。覆盖一个父类的方法,套用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 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。


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











© 著作权归作者所有

HappyBKs

HappyBKs

粉丝 660
博文 306
码字总数 481268
作品 0
浦东
程序员
私信 提问
playframework 拦截器

我觉得play的拦截器有点AOP的思想,相当于struts的filter,play的拦截器使用注解方式实现的。 源码定义了这么几种注解:@before、@after、@catch、@finally 可谓是三百六十度无死角的拦截了。...

2k10
2015/03/20
0
0
java并不认识python系列——谈谈搞混淆的@大法

怪自己二,曾一度理解java的@和python的@是类似的概念,在刷了python后,回头来再看java的注解各种懵逼,立下此文,以警后人,顺便,题段诗: python代码跑完后,冬雷滚滚夏雨雪。 java项目看...

守恒的猫
2017/11/03
0
0
System.arraycopy为什么快

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/79504818 前言 在 Java 编程中经常会遇到数组拷贝操作,一般会有如下四种方...

超人汪小建(seaboat)
2018/03/10
0
0
Spring Boot 注解—基本知识

注:该部分内容包含注解基本知识的讲解,如果对学习过java注解的同学可以直接跳过注解讲解部分,直接查看下一小节Spring Boot 注解—常用注解即可,如果对Spring Boot或者Spring MVC也比较熟...

爱编程的帅小伙
2018/07/02
0
0
秒懂,Java 注解 (Annotation)你可以这样学

文章开头先引入一处图片。 这处图片引自老罗的博客。为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的。至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明。好了,可以开始今...

wqhlmark64
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
51分钟前
3
0
通过四道常问面试题,带你了解什么是数据库分库分表

编者语:为了避免被误解为:「手里有把锤子,看什么都是钉子!」,说明一下不是什么业务都适合分布式数据库,更不是用了分布式数据库性能就一定能得到扩展。 其次:本文为纯干货,建议先转发...

老道士
今天
5
0
springmvc 整体流程

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR......

architect刘源源
今天
3
0
磁盘管理

先来看两个查看的命令 查看磁盘使用情况df 用法:df, df -h, df -m, df -k 查看目录或文件大小 用法:du -sh, du -sm, du -s(默认以k为单位) 新加一块盘如何操作 步骤:分区(可选)--> 格...

wzb88
今天
3
0
在 Linux 下确认 NTP 是否同步的方法

NTP 意即网络时间协议Network Time Protocol,它通过网络同步计算机系统之间的时钟。NTP 服务器可以使组织中的所有服务器保持同步,以准确时间执行基于时间的作业。NTP 客户端会将其时钟与 ...

Linux就该这么学
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部