文档章节

自定义注解Annotation的使用

boonya
 boonya
发布于 2015/04/17 07:07
字数 1442
阅读 3267
收藏 3

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
粉丝 73
博文 214
码字总数 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
0
注解-你可能需要知道这些

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

24K男
2017/09/28
0
0
关于注解那些事情

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

laohng1995
01/15
0
0
Java基础-注解

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

舞动的代码
2017/11/30
0
0
Android-Annotation教你写自定义注解

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

那个人
2017/11/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 识别慢性能的宏

Page Profiling 给你了有关页面在载入的时候操作缓慢的邪教,你可以将下面的内容添加到调试(debug)级别: Version 3.1 及其后续版本 设置包名字为 com.atlassian.renderer.v2.components.M...

honeymose
13分钟前
0
0
day93-20180920-英语流利阅读-待学习

时尚之觞:外表光鲜靓丽,其实穷得要命 Lala 2018-09-20 1.今日导读 讲到时尚界,我们脑海里浮现的可能都是模特和设计师光鲜靓丽、从容潇洒的模样。可是,最近在法国出版的一本书却颠覆了我们...

飞鱼说编程
28分钟前
0
0
maven的pom.xml用解决版本问题

maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用<exclusion>来排除一些...

JAVA码猿
52分钟前
1
0
20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
42
11

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部