自定义注解Annotation的使用

1.       前言

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

2.       自定义注解

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

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


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,如果使用了该标记,那么使用该注解的子类也会继承该注解的特性。

时间: 2024-10-12 22:22:57

自定义注解Annotation的使用的相关文章

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

gradle编译自定义注解(annotation)

最近把一个用eclipse构建的项目,加上了Gradle脚本,用它来编译.虽然最后编译是显示BUILD SUCCESSFUL,但是在编译过程中,却打印出一大堆栈信息,似乎是在编译我自定义的注解时出现的异常. 打印的栈信息前面部分如下: :assemble :lint Failed converting ECJ parse tree to Lombok for file E:\code\git\androidkit\andro idkit\src\com\lurencun\cfuture09\an

如何自定义注解Annotation,并利用反射进行解析

Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入的,目前已被广泛应用于各种Java框架,如Hibernate,Jersey,Spring.注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效. 在注解诞生之前,程序的元数据存在的形式仅限于java注释或javadoc,但注解可以提供更多

Java自定义注解Annotation详解

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上. 自定义注解及其应用 1).定义一个最简单的注解 public @interface MyAnnotation { //...... } 2).把注解加在某个类上: @MyAnnotation public class Annot

Java自定义注解Annotation的使用

从 jdk5开始,Java增加了对元数据的支持,也就是Annotation,Annotation其实就是对代码的一种特殊标记,这些标记可以在编译,类加载和运行时被读取,并执行相应的处理.当然刚刚说了,Annotation只是一种标记,所以要是在代码里面不用这些标记也是能完成相应的工作的,只是有时候用注解能简化很多代码,看起来非常的简洁. 常见的注解(Annotation) @Override——限定重写父类方法 @Deprecated——标示已过时 @SuppressWarning——抑制编译器

springmvc之自定义注解(annotation)

参考:日志处理 三:Filter+自定义注解实现 系统日志跟踪功能 1.项目结构 2.pom.xml,添加需要依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

深入理解Java:注解(Annotation)自定义注解入门

引用: http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected

(转)深入理解Java:注解(Annotation)自定义注解入门

向作者致敬! 转自:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email pro

[2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.J