Java中的注解--annotation

  Java中的基本注解,几乎框架中的注解都是依赖Java中的基本注解,很有必要学习一下Java中的基本注解。。。jdk 5 增加的新特性

一、注解的定义以及Java中常见的注解

注解就相当于一种标记,加了注解,就相当于为程序打上了某中标记,没加,则相当于没有这种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类和各种元素上有五任何标记,看你有何种标记,就去干相应的事,标记可以加在包、类、字段、方法、方法的参数以及局部变量上。

注解相当于一个特殊的类,人家写好的注解,你才可以引用,带上注解就相当于引用了一个注解所代表的类,Java中比较常见的几个注解,比如:

@Override、@SuppressWarnings("deprecation")、@Deprecated

二、自定义注解以及应用

注意:理解元注解的定义以及使用范围

 1 // 这个是元注解 在注解类上的注解
 2 @Retention(RetentionPolicy.RUNTIME)
 3 // 这个指定在哪些类型上能用 方法、类、属性还是什么其他的呢 
 4 // type 是比Class类范围更加大的一种表示方法 type可以表示类、接口或者是枚举或者是。。。
 5 @Target({ElementType.METHOD,ElementType.TYPE})
 6 public @interface ItcastAnnotation {
 7   
 8 }
 9 @ItcastAnnotation
10 public static void main(String[] args) {
11         
12         boolean flag = AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class);
13         
14         if(flag){
15             ItcastAnnotation annotation = AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
16             System.out.println(annotation);
17         }
18         
19     }

@Retention元注解中的RetentionPolicy有三种枚举:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME 对应着三个阶段 分别是 java源文件 --> class文件 --> 内存中字节码文件,默认的是RetentionPolicy.CLASS

@Target元注解中ElementType有几种不同类型的枚举,意思就是我定义的这个注解可以用到什么地方,是在包上、还是在类上、或者是在方法上、还是属性、构造方法上,记住这个元注解代表的什么含义就OK了。

 三、为注解增加基本属性

 注意:在oracle发布的 The Java® Language Specification java语言规范中规定了属性的返回值类型可以是:(从中拿过来的)

The return type of a method declared in an annotation type must be one of the following, or a compile-time error occurs:

• A primitive type 基本类型

• String 字符串

• Class or an invocation of Class (§4.5) 类或者是类的调用

• An enum type 枚举类型

• An annotation type 注解类型

• An array type whose component type is one of the preceding types (§10.1). 以上类型的数组形式

This rule precludes elements with nested array types,such as: //此规则排除具有嵌套数组类型的元素 这种是不可以的

@interface Verboten {

    String[][] value();

}

 1 // 这个是元注解 在注解类上的注解
 2 @Retention(RetentionPolicy.RUNTIME)
 3 // 这个指定在哪些类型上能用 方法、类、属性还是什么其他的呢 
 4 // type 是比Class类范围更加大的一种表示方法 type可以表示类、接口或者是枚举或者是。。。
 5 @Target({ElementType.METHOD,ElementType.TYPE})
 6 public @interface ItcastAnnotation {
 7   
 8     //这是一个方法,返回一个字符串,用注解的时候需要设置属性值
 9     String color() default "blue";
10     
11     // 这个是比较特殊的,当注解中只有value属性时候,引用注解的时候可以只写数值
12     // @ItcastAnnotation("abc") 这个注解的意思就是注解中只有一个value属性
13     // 但是你可以类似上面给其他属性设置默认值 @ItcastAnnotation("abc")的意思就是  @ItcastAnnotation(value="abc",color="blue")
14     String value();
15     
16     // 数组的属性
17     int[] arrayAttr() default {1,2,3};
18     
19     // 枚举类型
20     TrafficLamp lamp() default TrafficLamp.RED;
21     
22     // 注解类型 返回值是注解类型的属性值 
23     MetaAnnotation annotationAttr() default @MetaAnnotation("111");
24 }
25 
26 // 这个是如何使用自己定义的注解的属性,以及如何获取注解的属性值
27 @ItcastAnnotation(annotationAttr=@MetaAnnotation("112233"),color="red",value="abc",arrayAttr={1,2})
28 public class AnnotationTest {
29 
30     
31     @SuppressWarnings("deprecation")
32 //    @Override
33 //    @Deprecated
34     @ItcastAnnotation("abc")
35     public static void main(String[] args) {
36 
37         System.runFinalizersOnExit(true);
38         
39         boolean flag = AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class);
40         
41         if(flag){
42             ItcastAnnotation annotation = AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
43             System.out.println(annotation);
44             System.out.println(annotation.color());
45             System.out.println(annotation.value());
46             System.out.println(annotation.arrayAttr().length);
47             System.out.println(annotation.lamp().nextLamp().name());
48             System.out.println(annotation.annotationAttr().value());
49         }
50         
51     }
52 
53 }
posted @ 2019-04-27 10:35  ssc在路上  阅读(279)  评论(0编辑  收藏  举报