Java注解的简单了解

部分信息来自《Thinking In Java》

注解也成为元数据。什么是元数据?就是“关于数据的数据”

注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。

它可以用来完整的描述程序所需的信息,能够让编译器来测试和验证格式,存储有关程序的额外信息。

定义一个注解:

注解的样子和接口很像

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. @Target(ElementType.METHOD)  
  9. @Retention(RetentionPolicy.RUNTIME)  
  10. public @interface MyAnnotation {  
  11.   
  12. }  

定义注解时,需要一些元注解(关于注解的注解)例如:@Target和@Retention。

@Target用来定义你的注解应用于什么地方。例如:方法,域。

[java] view plain copy print ?
  1. @Target(ElementType.METHOD)  
  2. @Target(ElementType.CONSTRUCTOR)  
  3. @Target(ElementType.PARAMETER)  
  4. ...  

@Retention用来定义你的注解在哪个级别可用。例如:源代码中,类文件中或者运行时。
[java] view plain copy print ?
  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Retention(RetentionPolicy.CLASS)  
  3. @Retention(RetentionPolicy.SOURCE)  
如果一个注解中没有一个元素。那么它就称为标记注解。例如@Test。

在注解中,一般都会包含一些元素以表示某些值。当分析处理注解时,程序或工具可以利用这些值。

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. @Target(ElementType.METHOD)  
  9. @Retention(RetentionPolicy.RUNTIME)  
  10. public @interface MyAnnotation {  
  11.     public int value();  
  12. }  

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. public class UseAnnotation {  
  4.     @MyAnnotation(value = 10)  
  5.     public void useMyAnnotation() {  
  6.   
  7.     }  
  8. }  

如果没有读取注解的工具,那么注解也不会比注释更有用。

利用两个反射方法去解析一个含有某个注解的方法。

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. @Target(ElementType.METHOD)  
  9. @Retention(RetentionPolicy.RUNTIME)  
  10. public @interface MyAnnotation {  
  11.     int value();  
  12. }  

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. public class UseAnnotation {  
  4.     @MyAnnotation(value = 10)  
  5.     public void useMyAnnotation() {  
  6.   
  7.     }  
  8. }  

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. public class MyAnnotationParser {  
  6.   
  7.     public boolean findMethodByValue(int value) {  
  8.         for (Method method : UseAnnotation.class.getDeclaredMethods()) {  
  9.             MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);  
  10.             if ((myAnnotation != null) && (myAnnotation.value() == value)) {  
  11.                 return true;  
  12.             }  
  13.         }  
  14.         return false;  
  15.     }  
  16. }  

[java] view plain copy print ?
  1. package me.benzeph.annotation;  
  2.   
  3. import org.junit.Before;  
  4. import org.junit.Test;  
  5.   
  6. import static org.junit.Assert.assertFalse;  
  7. import static org.junit.Assert.assertTrue;  
  8.   
  9. public class MyAnnotationParserTest {  
  10.   
  11.     private MyAnnotationParser parser;  
  12.   
  13.     @Before  
  14.     public void setUp() throws Exception {  
  15.         parser = new MyAnnotationParser();  
  16.     }  
  17.   
  18.     @Test  
  19.     public void shouldReturnTrue() {  
  20.         assertTrue(parser.findMethodByValue(10));  
  21.     }  
  22.   
  23.     @Test  
  24.     public void shouldReturnFalse() {  
  25.         assertFalse(parser.findMethodByValue(5));  
  26.     }  


你可能感兴趣的:(Java注解的简单了解)