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注解的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用Java代码和注解完成Spring配置

LockSupport.java 中的 FIFO 互斥代码片段

如何在片段中使用 GetJsonFromUrlTask​​.java

如何在java web项目中添加自定义注解

# Java 常用代码片段

# Java 常用代码片段