文档章节

自定义注解Annotation的使用

boonya
 boonya
发布于 2015/04/17 07:07
字数 1442
阅读 3249
收藏 3
点赞 0
评论 0

1.       前言

JDK1.5以后,推出了注解新特性。注解的推出其实最主要的目的是为了让广大的用户认知EJB3.0,因为EJB2.X广受大多数开发者的诟骂和质疑。为了减少配置、让注解替代配置。有了注解,我们以前看似一般的、普通的JavaBean就有了活力,有了内涵,有了新的契机。配合SunJPA规范,EJB3.X又再次在企业级开发中大放异彩,让很多开发者赞不绝口。也许是无心插柳,这种“零配置”思维也影响着Java其他的开源项目——像StrutsSpringHibernate(也就是咱们耳熟能详的SSH)不都是具有“零配置”支持嘛!Java现在也是往动态、敏捷的方向发展着。有可能将来配置文件越来越少、规范、约定、注解代替了繁琐的配置信息。而XML估计会回归原始的使命——数据传输与数据交换。

2.       自定义注解

至于已有的注解,比如:JPAEJBSpring零配置等等怎么使用相信各位读者都能掌握,这里主要是说如何自定义自己的注解,自己使用自定义的注解。

我们先用一个简单的例子来看

package annotation;

 

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

 

/**

 * 注解

 *

 * @author  Administrator

 */

@Retention(RetentionPolicy.RUNTIME)

public @interface  Test {

 

    String isAop() default "false";

 

}

用关键字@interface 定义一个注解标记,使用@interface 关键字实际上的意思就是该接口继承自java.lang.annotation.Annotation接口。

String isAop() default "false";

这句话代表的意思就是在Test注解中可以含有属性名为isAop,此属性的类型是字符串类型。客户端使用的时候可以根据需要自己指定相关的属性值。如果客户端不指定值,默认值是false

@Retention(RetentionPolicy.RUNTIME)

这句话代表着将使用该注解类的信息值保持到真正的客户端运行时环境。

下面我们就来看看客户端的使用

package use;

 

import annotation.Test;

import annotation.TestImpl.TestProcess;

 

@Test(isAop = "true")

public class UseTest {

 

    /**

     * @param args

     * @throws ClassNotFoundException

     */

    public static void main(String[] args) throws ClassNotFoundException {

 

       TestProcess.process("use.UseTest");

 

    }

 

}

在客户端调用中在类UseTest上使用了@Test(isAop = "true")注解。仅仅定义了注解就像《三国杀》里,刘备是主公,他有“激将”的主公计,下了个命令:“蜀将何在?”,刘备的这句话太抽象了,蜀将相当于一个注解。在场的所有蜀将就像加了此注解的类,都会受到这句话的影响。具体替不替刘备出杀,~~~~个人表现不同(得先看看自己的身份啊)反贼的表现是:“这个真没有”;忠臣的表现是,先看看手上有杀吗?有,出击吧!没有就说:“这个……真没有!”;内奸的反应是:“唉,先保命还是装一装忠臣?比较纠结!”。这里的身份就好像是注解的属性的不同值。具体的处理就相当于针对注解的处理实现类。注解的具体实现类就是处理注解的业务逻辑,它需要Java的反射机制来处理客户目标类的具体注解,我们就来看看这个注解处理实现类。

package annotation.TestImpl;

 

import java.lang.annotation.Annotation;

 

public class TestProcess {

 

    public static void process(String str) throws ClassNotFoundException {

 

       Class clazz = Class.forName(str);

 

       Annotation[] annotations = clazz.getAnnotations();

 

       for (Annotation annotation : annotations) {

           System.out.println(annotation);

       }

    }

 

}

以上的处理逻辑很简单,就是根据一个字符串类名找到类。获得类的所有注解,所有注解是一个对象数组。遍历注解数组,输出相关注解信息。运行以上的程序结果如下

@annotation.Test(isAop=true)

如果我们使用注解的客户端代码替换一下

@Test

public class UseTest {

<span courier="" new";="" mso-hansi-font-family:"courier="" new";mso-bidi-font-family:"courier="" mso-font-kerning:0;"="" style="line-height: 23.333332061767578px;font-size: 13px;font-family: 宋体">……………………

}

对于注解的isAop并不特别指定。运行效果如下

@annotation.Test(isAop=false)

可以看到使用的是默认值false。如果注解中Annotation并没有指定默认值,而在客户端使用中也没指定值,那么不会通过编译。

@Retention(RetentionPolicy.XXXXXX)上面说到了是保留注解的有效期。

//会将注解保留到编译后的class中,加载类的时候不生效

@Retention(RetentionPolicy.CLASS)

//仅仅在代码保留,编译后的class不会保留

@Retention(RetentionPolicy.SOURCE)

//在编译后的class会有,通过反射也会获得注解信息

@Retention(RetentionPolicy.RUNTIME)

比如Override注解的源码

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.SOURCE)

public @interface Override {

}

因为复写在使用者使用的时候就可以看出来,所以没必要保留到运行期。

比如SuppressWarnings注解的源码

 

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

@Retention(RetentionPolicy.SOURCE)

public @interface SuppressWarnings {

    String[] value();

}

以上的不提示警告的注解也是在编译一个类前检查即可。

以上还使用了@Target注解,它代表着注解的修饰范围,类型是java.lang.annotation.ElementType枚举类型。

public enum ElementType {

    TYPE,//可以修饰成员变量

    METHOD,//可以修饰参数

    CONSTRUCTOR,//可以修饰局部变量

    ANNOTATION_TYPE,// <span courier="" new";="" mso-hansi-font-family:"courier="" new";mso-bidi-font-family:"courier="" color:black;mso-font-kerning:0;"="" style="line-height: 23.333332061767578px;font-size: 13px;font-family: 宋体">可以修饰Annotation

    PACKAGE//可以修饰包

}

Deprecated源码

@Documented

@Retention(RetentionPolicy.RUNTIME)

public @interface Deprecated {

}

Deprecated代表已过时的意思,这是一个保持到运行期的注解,在运行期可以通过反射获取此注解。这里还使用了@Documented这个元注解。它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。

还有一个注解就是Inherited,如果使用了该标记,那么使用该注解的子类也会继承该注解的特性。



本文转载自:http://blog.163.com/fang_lianggo@126/blog/static/36639740201211611541598/

共有 人打赏支持
boonya
粉丝 72
博文 211
码字总数 43922
作品 0
成都
高级程序员
Java注解(Annotation)详解

Java注解(Annotation)详解 1.Annotation的概念 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may......

幻海流心 ⋅ 05/23 ⋅ 0

注解-你可能需要知道这些

在日常的开发工作中,尤其是在使用一些比较受欢迎的开源框架时,我们不可避免的都使用到了注解(Annotation),注解的使用范围也越来越广,而且在使用了注解后,我们的代码看起来也更简洁了。...

24K男 ⋅ 2017/09/28 ⋅ 0

关于注解那些事情

最近突然看到其他人写的代码实现了自定义注解,好奇心被激活了。所以查了很多资料,然后写了一个简单的自定义注解,在写的过程中我发现了调用自定义注解的麻烦,所以我希望把我的代码贴出来,...

laohng1995 ⋅ 01/15 ⋅ 0

Java基础-注解

什么是注解? Jdk1.5新增新技术,注解。很多框架为了简化代码,都会提供有些注解。可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。 注解不会也不能影...

舞动的代码 ⋅ 2017/11/30 ⋅ 0

java.lang.annotation包类的浅析

1、先看一下annotation包下的类,作者的jdk是1.6版本。 Annotation是接口,the common interface extended by all annotation types,意思就就是说Annotation是所有注解类型的父类型,个人感觉...

杨树兴 ⋅ 2014/04/03 ⋅ 0

Android-Annotation教你写自定义注解

一 前言 我相信注解我们多多少少的都会接触到,常用的框架Butterknife、Retrofit、ARouter等等都用到了注解,我想大家都会去搜一下什么是注解了吧。这里呢就以一个Demo去了解一下自定义注解的...

那个人 ⋅ 2017/11/21 ⋅ 0

java中的注解(Annotation)

简介 注解,java中提供了一种原程序中的元素关联任何信息、任何元素的途径的途径和方法。 注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。注解不会改变程序的编译方式。java编...

林湾村龙猫 ⋅ 2016/11/28 ⋅ 0

JAVA 注解的几大作用及使用方法详解

注解(Annotation) 1、Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API...

超人学院 ⋅ 2016/07/25 ⋅ 0

深入理解注解(Annotation)

在现在的开发中,注解越来越多地应用到了开发中,无论是Servlet3.0新特性,还是SSH中的全注解,都给开发带来了极大的便利, 直观. 因此需要对注解有深入的理解. 一. 自定义注解 自定义注解的目...

长平狐 ⋅ 2012/09/03 ⋅ 0

第17篇-JAVA Annotation 注解

第17篇-JAVA Annotation 注解 每篇一句 :真的努力后你会发现自己要比想象的优秀很多 初学心得: 怀着一颗奋斗不息的心,一切困苦艰辛自当迎刃而解 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-0...

JEEP711 ⋅ 2017/08/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 37分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 44分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 47分钟前 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 49分钟前 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 50分钟前 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 53分钟前 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 今天 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部