作为一个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>
分享到:
相关推荐
### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器、工具或运行时系统提供额外信息的方式。自定义注解允许开发者创建自己的标记来满足特定需求,比如代码生成、验证、持久化等。本文将深入探讨...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,可以提供有关代码的附加信息,而这些信息并不直接影响代码的执行。在Java中,注解用于向编译器、JVM或...
虽然Java虚拟机(JVM)本身忽略Annotation,但通过特定的工具,如Java编译器或自定义的Annotation处理器,可以处理和利用这些信息。 二、Annotation的定义与语法 1. Annotation概念:它以类似修饰符的形式出现在...
在《Java Annotation入门》之后的这篇《重难点之JavaAnnotation手册》中,作者深入探讨了Annotation的概念、定义以及其在Java开发中的应用。 一、Annotation是什么? Annotation是一种在代码中添加的特殊注解,用于...
Java 注解(Annotation)是Java语言提供的一种元编程机制,它允许程序员在源代码的各个元素(如类、方法、变量...在"java annotation demo"中,你可以学习到如何定义、应用和解析注解,进一步掌握这一强大的编程特性。
在IT行业中,自定义注解(Annotation)是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,增强了代码的可读性和可维护性。这些元数据可以被编译器或运行时环境用来执行特定的任务,例如代码分析、...
《Java Annotation手册》 在Java编程语言中,注解(Annotation)是一种元数据,它提供了在编译时或运行时处理代码的一种方式。通过注解,开发者可以向编译器或JVM提供有关代码的附加信息,而这些信息通常不直接影响...
从Java 6开始,自定义Annotation的使用也得到了增强,允许开发者创建自己的Annotation类型。 2. 自定义Annotation:自定义Annotation需要定义一个接口,这个接口就是Annotation类型。通过定义成员变量(通常带有...
通过上述示例中的JavaAnnotation压缩包,你可能包含了注解的使用示例、源码以及相关的博客文章。源码可以帮助你理解注解的实际应用,而博客文章可能深入解释了注解的工作原理和最佳实践。学习这些材料,将有助于你...
Java的`javax.annotation.processing.Processor`接口定义了注解处理器的规范。 5. 使用注解 注解可以应用于类、方法、字段、参数、构造函数、包等不同级别。例如: ```java @MyAnnotation("Hello, World!") ...
在本主题中,我们将深入探讨如何创建和使用自定义的`annotationProcessor`,以及它在IDEA中的应用。 首先,让我们了解什么是`annotationProcessor`。`annotationProcessor`,也称为注解处理器,是在Java编译过程中...
Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供有关代码的附加信息。这些信息不直接影响代码的执行,但...在《Java Annotation高级应用》中,可能会涵盖这些高级主题。
Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...
Annotation简化了代码,提高了可读性和可维护性,尤其是在现代Java框架中广泛应用。 ### Annotation的基本概念 1. **Annotation类型**:定义了一个特定的注解,类似于接口,包含名称和多个注解元素。每个定义的...
【Annotation技术】是Java语言中的一个重要特性,引入于JDK5,主要目的是为程序元素(如包、类、方法、变量等)添加元...通过自定义和使用各种Annotation,开发者可以构建出更高效、更易于管理和维护的Java应用程序。
Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...
本文将详细介绍Java注解的作用、应用场景以及如何自定义注解。 Java注解是一种强大的工具,它们为代码提供了额外的元数据,可以在编译时和运行时发挥多种作用。通过自定义注解,开发者可以创建灵活的框架和库,提高...