`
denger
  • 浏览: 356962 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义 Java Annotation及应用

    博客分类:
  • Java
阅读更多
     作为一个Javaer 我想对于 Java Annotation(注解或元数据)并已不是什么新鲜的东西了,在现在流行的SSH、JUnit等框架中早也已经广泛使用,然而在我们实际开发中对于自定义 Annotation 的场景和需求也并不见得多,大多数都还是以使用为主。

  1. 基本语法
  
package org.denger.annotation.example;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
// The @Bind tag.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bind {
    public String name();

    public int time() default 0;
}

       以上是一个用于Method级的简单的@Bind注解类,比较有点象接口的结构,事实上,与其它任何Java接口一样,注解也将会编译成class文件。
      
package org.denger.annotation.example;
/**
 * Use the @Bind tag.
 */
public class BindCase {

	@Bind(name="case", time=1)
	public void method(){
		// do something..
	}

	public void method1(){
		// do something..
	}

	@Bind(name="case1", time=20)
	public void method2(){
		// do something..
	}
}


编写注解处理器:
     在 JASE 1.5扩展了了反射机制的API,为我们提供了相应的注解处理器的API,另外还可以通过外部工具 apt 来解析带有注解的Java Code.
   
public class BindCaseTracker{
	
	private static Logger logger = Logger.getLogger(BindCaseTracker.class);
	
	public static void printBindCase(Class<?> bindClass){
		assert bindClass != null;
		for (Method method : bindClass.getDeclaredMethods()){
			Bind bind = method.getAnnotation(Bind.class);
			if (bind == null) continue; // Not found annotation.

			logger.debug(String.format("Found [%s] Bind Case : %s-%d", method
					.getName(), bind.name(), bind.time()));
		}
	}

	public static void main(String[] args) {
		BindCaseTracker.printBindCase(BindCase.class);
	}
}  /* Output:
[DEBUG] 11-08 14:15 Found [method] Bind Case : case-1
[DEBUG] 11-08 14:15 Found [method2] Bind Case : case1-20
*///~


  2. 元注解
     在J2SE中内置了三种常用标准注解(Override, Deprecated, SuppressWarnings)以及四种元注解:
     @Target:  表示该注解可以用于什么地方。可用ElementType枚举类型主要有:
               TYPE : 类、接口或enum声明
               FIELD: 域(属性)声明
               METHOD: 方法声明
               PARAMETER: 参数声明
               CONSTRUCTOR: 构造方法声明
               LOCAL_VARIABLE:局部变量声明
               ANNOTATION_TYPE:注释类型声明
               PACKAGE: 包声明
     @Retention:  表示需要在什么级别保存该注解信息。可用RetentionPolicy枚举类型主要有:
              SOURCE: 注解将被编译器丢弃。
              CLASS  :  注解在class文件中可能。但会被VM丢弃。
              RUNTIME: VM将在运行时也保存注解(如果需要通过反射读取注解,则使用该值)。
     @Documented:  将此注解包含在Javadoc中。
     @Inherited:  允许子类继承父类中的注解。

  3. 使用技巧
           a. 如果希望定义的注解用于多种  ElementType 的话可以写成:
import static java.lang.annotation.ElementType
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

           b. 在声明注解中的方法时可通过 default 来指定默认值。
           c.  在声明注解中的方法返回类型可结合泛型使用,如:
Class<? extends Payload>[] payload() default {};

           d. 可在注解类中定义嵌套注解,如:
import static java.lang.annotation.ElementType

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface NotNull {
	String message() default "{javax.validation.constraints.NotNull.message}";

	@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
	@Retention(RUNTIME)
	@Documented
	@interface List {
		NotNull[] value();
	}
} 

@NotNull.List(value = { @NotNull })
protected List<?> list;

        e. 在JASE中提供了很少的内置注解,不过JBoss提供了一个 validation-api 的类库,提供常用验证注解。有兴趣的朋友可以下载看看,其 maven 依赖为:
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.0</version>
</dependency>
6
0
分享到:
评论

相关推荐

    Java Annotation注解.doc

    初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation生成javabean映射xml文件)还需要进一步的研究和探讨。涉及到深入annotation的内容,作者将在后文...

    Java Annotation入门.doc

    本文针对java初学者或者annotation初次使用...初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation生成javabean映射xml文件)还需要进一步的研究和探讨。

    Java+Annotation.pdf

    针对java 初学者或者annotation 初次使用者全面地说明了annotation 的使用方法、定义 方式、分类。...annotation 应用(例如使用自定义annotation 生成javabean 映射xml 文件)还需要进一步的 研究和探讨

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    Java开发详解.zip

    031602_【第16章:Annotation】_自定义Annotation笔记.pdf 031603_【第16章:Annotation】_反射与Annotation笔记.pdf 031604_【第16章:Annotation】_深入Annotation笔记.pdf 031701_【第17章:Java数据库编程】_...

    annotationprocessortest:用于自定义注释处理器的演示 Java 应用程序

    注释处理器测试 用于自定义注释处理器的演示 Java 应用程序

    java开源包4

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包101

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    自定义注解及注解处理器PPT+Demo

    Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能...

    java开源包11

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包6

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包9

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包8

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包10

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java开源包5

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

    java高级特性,涵盖了多种java常用的一些例子

    涉及多种线程,死锁,同步队列,异步线程,涵盖了java的自定义注解及反射,包含了23种设计模式,含注释, 线程1(基本应用) 线程2(同步,死锁,线程池) 注解和泛型 Java 注解(Annotation)又称 Java 标注,是 ...

    Java测试新技术TestNG和高级概念.part1

    6.6 编写自定义Annotation 6.7 本章小结 第7章 闲言碎语 7.1 动机 7.2 TestNG哲学 7.3 关注和提供异常 7.4 有状态的测试 7.5 测试驱动开发的缺点 7.6 测试私有方法 7.7 测试与封装 7.8 调试器的威力 7.9 记日志的...

    java开源包1

    jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG...

Global site tag (gtag.js) - Google Analytics