`
foryougeljh
  • 浏览: 113215 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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();
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics