`
denger
  • 浏览: 359225 次
  • 性别: 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的使用

    ### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...

    自定义注解annotation及用法

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器、工具或运行时系统提供额外信息的方式。自定义注解允许开发者创建自己的标记来满足特定需求,比如代码生成、验证、持久化等。本文将深入探讨...

    java之Annotation及其应用

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,可以提供有关代码的附加信息,而这些信息并不直接影响代码的执行。在Java中,注解用于向编译器、JVM或...

    JavaAnnotation手册[借鉴].pdf

    虽然Java虚拟机(JVM)本身忽略Annotation,但通过特定的工具,如Java编译器或自定义的Annotation处理器,可以处理和利用这些信息。 二、Annotation的定义与语法 1. Annotation概念:它以类似修饰符的形式出现在...

    重难点之JavaAnnotation手册.pdf

    在《Java Annotation入门》之后的这篇《重难点之JavaAnnotation手册》中,作者深入探讨了Annotation的概念、定义以及其在Java开发中的应用。 一、Annotation是什么? Annotation是一种在代码中添加的特殊注解,用于...

    java annotation demo

    Java 注解(Annotation)是Java语言提供的一种元编程机制,它允许程序员在源代码的各个元素(如类、方法、变量...在"java annotation demo"中,你可以学习到如何定义、应用和解析注解,进一步掌握这一强大的编程特性。

    2个案例 自定义annotation进行查询对象封装 itext 打印案例

    在IT行业中,自定义注解(Annotation)是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,增强了代码的可读性和可维护性。这些元数据可以被编译器或运行时环境用来执行特定的任务,例如代码分析、...

    Java Annotation手册

    《Java Annotation手册》 在Java编程语言中,注解(Annotation)是一种元数据,它提供了在编译时或运行时处理代码的一种方式。通过注解,开发者可以向编译器或JVM提供有关代码的附加信息,而这些信息通常不直接影响...

    JavaAnnotation手册.pdf

    从Java 6开始,自定义Annotation的使用也得到了增强,允许开发者创建自己的Annotation类型。 2. 自定义Annotation:自定义Annotation需要定义一个接口,这个接口就是Annotation类型。通过定义成员变量(通常带有...

    JAVA Annotation学习

    通过上述示例中的JavaAnnotation压缩包,你可能包含了注解的使用示例、源码以及相关的博客文章。源码可以帮助你理解注解的实际应用,而博客文章可能深入解释了注解的工作原理和最佳实践。学习这些材料,将有助于你...

    Java annotation (JDK5)

    Java的`javax.annotation.processing.Processor`接口定义了注解处理器的规范。 5. 使用注解 注解可以应用于类、方法、字段、参数、构造函数、包等不同级别。例如: ```java @MyAnnotation("Hello, World!") ...

    自定义annotationProcessor

    在本主题中,我们将深入探讨如何创建和使用自定义的`annotationProcessor`,以及它在IDEA中的应用。 首先,让我们了解什么是`annotationProcessor`。`annotationProcessor`,也称为注解处理器,是在Java编译过程中...

    Java Annotation注解.doc

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但...在《Java Annotation高级应用》中,可能会涵盖这些高级主题。

    java 自定义注解验证

    Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...

    Java Annotation注解技术

    Annotation简化了代码,提高了可读性和可维护性,尤其是在现代Java框架中广泛应用。 ### Annotation的基本概念 1. **Annotation类型**:定义了一个特定的注解,类似于接口,包含名称和多个注解元素。每个定义的...

    Annotation技术

    【Annotation技术】是Java语言中的一个重要特性,引入于JDK5,主要目的是为程序元素(如包、类、方法、变量等)添加元...通过自定义和使用各种Annotation,开发者可以构建出更高效、更易于管理和维护的Java应用程序。

    Java Annotation的讲解和例子

    Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...

    Java注解(Annotation)全面解析:作用、应用与自定义实践

    本文将详细介绍Java注解的作用、应用场景以及如何自定义注解。 Java注解是一种强大的工具,它们为代码提供了额外的元数据,可以在编译时和运行时发挥多种作用。通过自定义注解,开发者可以创建灵活的框架和库,提高...

Global site tag (gtag.js) - Google Analytics