java注解

http://javaopen.iteye.com/blog/645915

注释有3中基本类型

a.标记注释    --没有变量,只有名称标识。例如 @annotation
b.单一值注释  --在标记注释的基础上提供一段数据。如 @annotation("data")
c.完整注释    --可以包括多个数据成员,每个数据成员由名称和值构成。 @annotation(val1="data1",val2="data2")

Java的"注释"
Java中提供3个内置注释类型
a. Override ,只能用于方法(不能用于类,包声明或者其他构造)
              作用:可以保证编译时候Override函数的声明正确性
              用法:@Override public void fun(){..}

b.Deprecated  同样只能作用与方法
              作用:对不应再使用的方法进行注解
              用法:@Deprecated public void fun{...}

c.SupressWarnings 可以注释一段代码
                  作用:关闭特定的警告信息,例如你在使用泛型的时候未指定类型
                  用法: @SupressWarnings(value={"unchecked"})
                       

Java中还提供了四种元注释,专门负责注释其他的注释
@Target   表示该注释可以用于什么地方。可用的ElementType参数包括:
          CONSTRUCTOR : 构造器的声明
          FIELD : 域声明(包括enum实例)
          LOCAL_VARIABLE : 局部变量声明
          METHOD : 方法声明
          PACKAGE : 包声明
          PARAMETER : 参数声明
          TYPE : 类、接口(包括注解类型)或enum声明


@Retention 表示需要在什么级别保存该注释信息。可选的RetentionPoicy参数包括:
           SOURCE : 注释将被编译器丢掉
           CLASS : 注释在class文件中可用,但会被VM丢弃
           RUNTIME : VM将在运行时也保留注释,因此可以通过反射机制读取注释的信息。


@Documented 将注释包含在JavaDoc中

@Inheried  允许子类继承父类中的注释。

3. 在Java中定义自己的注释
Java语言支持一种新的类型--注释类型(annotation type),跟普通类差不多,在类中以符号(@)的形式注释其他Java代码

下面将通过一个简单的例子来实现(代码是Brett McLaughlin 的)
定义注释
@interface 申明

i.简单的注释类型
package com.oreilly.tiger.ch06;
public @interface InProgress { }

ii.使用定制的注释类型
@com.oreilly.tiger.ch06.InProgress
public void calculateInterest(float amout,float rate)
{
      //Need to finish this method later
}

iii.添加成员
package com.oreilly.tiger.ch06;

public @interface InProgress {
    String value();
}
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性), 那么可以省略value=部分,例如:@MyAnnotation("lhm")。

iv.设置默认值
package com.oreilly.tiger.ch06;
public @interface GroupTODO {
  public enum Serverity { CRITICAL,IMPORTANT,IRIVIAL,DOCMENTATION };
  Severity severity() default Severity.IMPORTANT;
  String item ();
  String assignedTo();
  String dateAssigned();
}
}

v.使用默认值
@com.oreilly.tiger.ch06.InProgress
@GroupTODO(
 item="Figure out the amount of interest per month",
 assignedTo = "Brett McLaughlin",
 dateAssigned = "08/04/2004"
)

public void calculateInterest(float amount, float rate)
{
   //Need to finish this method later
}

vi.改写默认值
@com.oreilly.tiger.ch06.InProgress
@GroupTODO
{
   severity = GroupTODO.Severity.DOCUMENTATION,
   item = "Need to explain how this rather unusal method works",
   assignedTo = "Jon Stevens",
   dateAssigned = "07/30/2004"
}

自定义注解及其应用
定义一个最简单的注解:public @interface MyAnnotation {}
把它加在某个类上: @MyAnnotation public class AnnotationTest{}

用反射进行测试AnnotationTest的定义上是否有 @MyAnnotation
if(ReflectPoint.class.isAnnotationPresent(MyAnnotation.class)) {
    System.out.println(AnnotationTest.class.getAnnotation(MyAnnotation.class)
);
检查返回的注解对象的类名,发现它其实是一个代理。
@SuppressWarnings("deprecation")
@MyAnnotation(value="zxx",arrayAttr={3,5,6},lamp=EnumTest.TrafficLamp.GREEN)
public class AnnotationTest {
    public static void main(String[] args) {
        
        System.runFinalizersOnExit(true);
        if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class))
        {
            MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
            System.out.println(myAnnotation.color());
            System.out.println(myAnnotation.value());
            System.out.println(myAnnotation.arrayAttr().length);
            System.out.println(myAnnotation.lamp().next().name());
            System.out.println(myAnnotation.annotationAttr().value());
        }
        
        
    }
}
-----------------------------------------------------
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
    String color() default "yellow";
    String value() ;
    int [] arrayAttr() default {1,2};
    EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
    MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");
}


定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")
用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个 @MyAnnotation是MyAnnotaion类的一个实例对象
为属性指定缺省值:
String color() default "yellow";
value属性:
String value() default "zxx";

为注解增加高级属性
数组类型的属性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括

枚举类型的属性
EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation("yyy"))
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
    MetaAnnotation ma =  myAnnotation.annotationAttr();
    System.out.println(ma.value());

枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。
在程序中如何创建出一个注解的实例对象啊?直接用@放上一个标记即可
MetaAnnotation注解的定义:
public @interface MetaAnnotation {
   String value();
}

你可能感兴趣的:(java注解)