目录
1.元注解
2.注解的声明
3.注解的使用
4.重复注解
java提供了一套java注解(Annotation)的机制,与java中的注释不同,注解是一种类型.通过使用注解,可以对方法,类,参数,包,域以及变量等添加标记(即附上某些信息),之后通过反射将标记的信息提取出来以供使用.
1.元注解
java.lang.annotation包提供了4种元注解,负责对注解类型进行约束,他们本身也实现了自注解.
@Target:表示该注解用于什么位置,可选的参数是ElementType枚举中的成员:
TYPE | 类型声明(类,接口,enum) |
FIELD | 成员变量声明(对象,属性,enum的实例) |
METHOD | 方法声明 |
PARAMETER | 参数声明 |
CONSTRUCTOR | 构造器声明 |
LOCAL_VARIABLE | 局部变量声明 |
ANNOTATION_TYPE | 注解声明 |
PACKAGE |
包声明 |
ElementType在SE1.8中又加入了两个成员:TYPE_PARAMETER,TYPE_USE.
@Retention:表示需要在什么级别保存该注解信息(生命周期),可选的参数是RetentionPolicy枚举中的成员:
SOURCE | 停留在java源文件,会将被编译器丢弃 |
CLASS | 停留在class文件中,但会被VM丢弃 |
RUNTIME | 内存中的字节码,VM在运行期间保留注解 |
注意,只有声明为RUNTIME,才可以通过反射机制读取注解的信息.
@Document:将注解包含在Javadoc中
@Inherited:允许子类继承父类中的注解,只针对CLASS级别的注解有效
2.注解的声明
语法:通过关键字@interface定义,默认继承Annotation接口.注解中通常会有一些元素(),用来表示一些值.这些元素看起来与接口中的方法相似,但是是无参的,并且可以通过default提供默认值,但默认值不能为null.注解中的元素只能是以下类型{所有基本类型,String,Class,Enum,Annotation(但不能是自己),以及以上类型的一维数组形式}.例:
import java.lang.annotation.Target; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AnnotateDemo { int i(); float f() default 3.14f; char[] c(); String[] s() default { "primitive type", "String", "Class", "annotation", "enumeration", "arrays" }; Class<String> cls() default String.class; Override ovr(); ElementType elmt(); }
注解可以不用元注解进行约束,也可以没有元素,没有元素的注解称为标记注解,例:
public @interface AnnotateDemo { }
默认的ElementType可以是任意类型,RetentionPolicy是CLASS.
3.注解的使用
当我们定义了一个注解之后,便可以在允许的位置进行标记,标记时必须对注解内的元素进行赋值,有默认值的元素可以选择性赋值.如果注解只有一个元素且该元素的名称是value的话,在使用注解的时候可以省略"value="直接写需要的值即可.例:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface AnnotateDemo { int i(); String s() default "hello"; } public class AnnotateDemo3 { @AnnotateDemo(i = 97) public void a() { } @AnnotateDemo(i = 98, s = "world") public void b() { } public void c() { } public void d() { } }
使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器.注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理.在上述程序中加入:
public static void track(List<Integer> list, Class<?> cl) { for (Method m : cl.getDeclaredMethods()) { AnnotateDemo ant = m.getAnnotation(AnnotateDemo.class); if (ant != null) { System.out.println("Found:" + ant.i() + "_" + ant.s()); list.remove(new Integer(ant.i())); } } for (int value : list) { System.out.println("notFound:" + value); } } public static void main(String[] args) { List<Integer> list = new ArrayList<>(); Collections.addAll(list, 97, 98, 99, 100); track(list, AnnotateDemo3.class); }
静态方法track需要List和Class的参数,遍历cl中的方法,通过getAnnotation()方法,判断cl中的方法是否被标记.如果是,则输出注解的详细信息,然后在list中remove掉对应的值,最后再输出list中剩下的值.输出结果:
Found:97_hello
Found:98_world
notFound:99
notFound:100
这也是一个简单的跟踪项目中的例子.
4.重复注解
SE1.8引入了重复注解的特性,允许在声明同一类型时使用多次同一个注解,提高了程序的可读性,例:
import java.lang.annotation.Repeatable; @Repeatable(AnnotateDemoFactory.class) @interface AnnotateDemo { String s(); } @interface AnnotateDemoFactory { AnnotateDemo[] value(); } public class AnnotateDemo4 { @AnnotateDemo(s = "hello") @AnnotateDemo(s = "world") public void a() { } }
通过使用另一个注解来存储重复注解,创建重复注解AnnotateDemo时,加上@Repeatable,指向存储注解AnnotateDemoFactory.在使用时可以重复使用AnnotateDemo来进行标记.
小结:了解java中注解的用法需要对反射有一定了解,通过使用注解可以实现生成文档,编译检查等功能,同时增加了程序的可读性.
相关推荐
在Java中,注解(Annotation)主要用于编译器检查、代码生成、运行时处理等方面。本文将深入探讨如何通过反射机制来获取自定义注解以及其在字段上的应用。 首先,我们需要了解什么是自定义注解。自定义注解是以`@`...
Java 自定义注解验证是Java开发中的一个重要特性,它允许开发者创建自己的元数据,以便在编译时或运行时对代码进行验证和处理。自定义注解为代码提供了额外的信息,使得程序更具可读性、可维护性和灵活性。在本案例...
在Java中,我们可以使用反射API或者AOP(面向切面编程)来处理注解。例如,我们可以创建一个切面,该切面会在方法调用前/后检查是否有`@Query`注解,并根据注解中的SQL模板执行数据库操作。 3. **动态SQL**: 使用...
java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解...
在Java开发中,除了JUnit,Spring框架也广泛使用注解。`@Autowired`用于自动装配依赖,使得无需显式使用setter方法或构造函数注入。`@Component`、`@Service`、`@Repository`和`@Controller`定义了不同的bean类型,...
Java自定义注解是Java编程语言中的一个重要特性,它允许程序员在代码中插入元数据,这些元数据可以被编译器或运行时环境用来执行特定的任务。自定义注解不仅提高了代码的可读性,还简化了代码处理,特别是在框架和库...
Java中的Web服务通常使用JAX-WS(Java API for XML Web Services)或JAX-RS(Java API for RESTful Web Services)来实现。 Java注解在构建Web服务时发挥着关键作用,它们可以用来标注类、方法或其他程序元素,以...
在Java中,注解以`@`符号开头,后面跟着注解的名称。自定义注解可以通过`@interface`关键字来创建,例如: ```java @interface MyAnnotation { String value(); } ``` 这定义了一个名为`MyAnnotation`的注解...
java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo; java自定义注解接口限流demo...
本篇文章将深入探讨Java注解的使用,包括其基本概念、类型、使用场景以及如何自定义注解。 首先,Java提供了三种预定义的注解类型,它们是: 1. `@Override`:确保方法真正重写了超类中的方法,如果找不到匹配的...
本文档简述了有关javabean中id的注解解释,注解本来就很繁琐,但是学好的话用起来还是比较方便的
Java 元注解详解 Java 元注解是 Java 注解的重要特性,它们是用于修饰注解的注解。Java 元注解的作用是通过使用 ...在实际开发中, Understanding Java 元注解的作用和使用场景对于提高编程效率和代码质量非常重要。
Java 自定义注解实践是 Java 语言中的一项重要特性,它可以使开发者自定义注解,以满足不同的需求。在本文中,我们将详细介绍 Java 自定义注解的概念、特点、实现方式及实践应用。 概念 ---- Java 自定义注解是 ...
注解在Java中扮演着元编程的角色,允许开发者在不改变程序执行逻辑的前提下,向代码添加额外的信息,如编译检查、序列化处理、持久化、运行时动态处理等。本文将深入探讨Java注解的API及其使用。 1. **注解的基本...
接下来,我们可以在代码中使用这个自定义注解: ```java public class MyClass { @MyAnnotation(value = "Hello, Annotation!") public void myMethod() { // ... } } ``` 然后,我们可以利用反射来获取并处理...
当定义了一个注解类型,开发者可以在代码中使用这个注解来标记程序元素。编译器或运行时环境会根据`RetentionPolicy`来决定是否保留这些注解。然后,通过Java反射API,可以获取到这些注解信息,进行相应的处理。 ...
在这些技术中,注解(Annotation)的使用日益普及,极大地简化了配置工作,增强了代码的可读性和维护性。本文将深入探讨Java和SSH框架中的注解及其应用。 首先,让我们从Java的注解开始。Java注解是一种元数据,它...
在Java编程中,注解...这个示例涵盖了Java中使用反射获取注解的基本操作,包括类、方法、注解的值和方法参数。通过实践这个例子,你可以更好地理解和掌握这些概念,从而在实际项目中更有效地利用注解和反射。
本示例将探讨如何在Java中使用注解以及如何通过Ant构建工具来运行带有注解的程序。 首先,Java注解以`@`符号开头,后面跟着注解类型。例如,`@Override`是一个内置注解,表示方法试图重写超类中的方法。其他常见的...
在Java中,你可以通过`@interface`关键字来定义一个注解。注解包含元素(也称为成员),这些元素可以有默认值,也可以接受参数。例如,我们可以定义一个名为`@GenerateTable`的注解,它可能包含`tableName`和`...