java注解的使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java注解的使用相关的知识,希望对你有一定的参考价值。
java注解的使用
原文:http://www.cnblogs.com/pepcod/archive/2013/02/16/2913474.html
注解(也被称为元数据)的语法比较简单, 除了@符号的使用之外, 它基本与java固有的语法一致. Java SE5内置了三种, 定义在java.lang中的注解:
(1) @Override
(2) @Deprecated
(3) SupressWarings: 关闭不当的编译器警告信息.
Java还另外提供了四种注解, 专门负责新注解的创建:
@Target 表示该注解可以用于什么地方,可能的ElementType参数有:
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类,接口或enum声明
@Retention 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
SOURCE:注解将被编译器丢弃
CLASS:注解在class文件中可用,但会被VM丢弃
RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。
@Documented 将注解包含在Javadoc中
@Inherited 允许子类继承父类中的注解
定义一个注解的方式:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Test { }
除了@符号,注解很像是一个接口。定义注解的时候需要用到元注解.
在注解中一般会有一些元素以表示某些值。注解的元素看起来就像接口的方法,唯一的区别在于可以为其制定默认值。没有元素的注解称为标记注解,上面的@Test就是一个标记注解。
注 解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确定的值,即 要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用 注解的时候可以省略“value=”,直接写需要的值即可.
下面看一个定义了元素的注解。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface UserCase { public String id(); public String description() default "no description"; }
定义了注解,必然要去使用注解
public class PasswordUtils { @UseCase(id = 47, description = "Passwords must contain at least one numeric") public boolean validatePassword(String password) { return (password.matches("\\\\w*\\\\d\\\\w*")); } @UseCase(id = 48) public String encryptPassword(String password) { return new StringBuilder(password).reverse().toString(); } }
使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器。
从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。
public static void main(String[] args) { List<Integer> useCases = new ArrayList<Integer>(); Collections.addAll(useCases, 47, 48, 49, 50); trackUseCases(useCases, PasswordUtils.class); } public static void trackUseCases(List<Integer> useCases, Class<?> cl) { for (Method m : cl.getDeclaredMethods()) { UseCase uc = m.getAnnotation(UseCase.class); if (uc != null) { System.out.println("Found Use Case:" + uc.id() + " " + uc.description()); useCases.remove(new Integer(uc.id())); } } for (int i : useCases) { System.out.println("Warning: Missing use case-" + i); } }
运行结果:
Found Use Case:47 Passwords must contain at least one numeric Found Use Case:48 no description Warning: Missing use case-49 Warning: Missing use case-50
以上是关于java注解的使用的主要内容,如果未能解决你的问题,请参考以下文章
LockSupport.java 中的 FIFO 互斥代码片段