注解
这两天了解了一下注解,有一点小心得,记录一下,这里主要不是罗列Java注解的方方面面,如果要详细了解,请参考java编程思想,(真的是一本好书) 。
我们如果想学习注解,主要向了解的就是RUNTIME的注解,也就是在运行时能够通过反射机制获取的。注解分很多类型,类上的注解,方法上的注解,成员变量的注解等,我们可以在java运行时通过反射查看某个类或是方法等是否具有某个注解,然后编写相应的注解处理代码
如:
@Target(ElementType.RUNTIME)
@Retention(RetentionPolicy.METHOD)
public @interface FirstAnnotation{
String name();
String int age() default 20;
}
public class Test{
@FirstAnnotation(name="kevin")
public void sayHello(){}
}
FirstAnnotation anno = Method.getAnnotation(FirstAnnotaion.class);
这里我们就能获取到注解的值了
System.out.println(anno.name()) //kevin
System.out.println(anno.age()) //20 因为设定了默认值,所以没有赋值时也有值
其他注解也可以通过相应的注解
如:
Field f; f.getAnnotation(XXX1Annotation.class);
Class c: c.getAnnotation(XXX2Annotation.class);
注意:千万不要想着可以获取局部变量的注解
@Target(ElementType.LOCAL_VARIABLE)
这种在运行时是获取不到的,请参考http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.6.3.2
获取方法参数变量的方法有一点不同,这里讲一下
先定义一个方法参数注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy)
@MyDateAnnotation(){
String format() default "yyyy-MM-dd"
}
class DateTest{
public String dateFormat(@MyDateAnnotation()Date date){
}
public static void main(String[]args){
DateTest c = DateTest.class;
Method method = c.getMethod("dateFormat",Date.class);
Annotation[][] annos = method.getParameterAnnotation();
MyDateAnnotation an = (MyDateAnnotation)annos[0][0];
System.out.println(an.format()); //输出yyyy-MM-dd
}
}
稍微解释下:
因为每个方法参数可以有多个注解,所以我能能够理解为什么获得的是一个Annotatio数组了
Annotation[0]代表第一个参数的注解,Annotation[1]代表第二个参数的注解,依次类推