注解基础知识:
注解(Annotation)很重要,未来的开发模式都是基于注解的,
Spring2.5以上都是基于注解的,Hiernate3.x也是基于注解的,
现在structs2有一部分也是基于注解的。注解时一种趋势,注是JDK1.5之后才有的新特性
JDK1.5之后提供三个注解:
@Deprecated 废弃的、过时的
@Override 重写 覆盖
@SuppressWarnings 压缩警告
添加属性:
/**
* @auther XuXin
* @date 2019/2/11 14:41
*/
//添加属性
@Retention(RetentionPolicy.RUNTIME)
//Retention注解决定MyAnnotation注解的生命周期
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
//定义基本属性
String color() default "blue";//缺省值可以省略
String value();//定义一个名称为value的属性
}
//注解更像是一种特殊的接口,注解的属性定义方式就和接口中定义方法的方式一样,
// 而应用了注解的类可以认为是实现了这个特殊的接口
应用属性
/**
* 应用属性
* @auther XuXin
* @date 2019/2/11 14:42
*/
@MyAnnotation(color = "red",value = "12")//应用MyAnnotation注解的color对象
public class ArithmeticCalculatorIml {
public static void main(String[] args){
/**
* 通过反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
*/
MyAnnotation annotation=(MyAnnotation) MyAnnotation.class.getAnnotation(MyAnnotation.class);
System.out.println(annotation.color());
System.out.println(annotation.value());
}
}
返回值应该为 red 12
为注解增加高级属性
1、数组类型属性:
增加数组类型属性: int[] arrayAttr() default {1,2,3,4}
应用数组类型属性:@MyAnnotation(arrayAttr={2,34,5})
如果数组属性只有一个值,这个时候属性值部分可以省略大括号,如:@MyAnnotation(ayyayAttr=2),这表示数组属性只有一个值,值为2
2、枚举类型属性
增加枚举类型属性:EnumTrafficLamp lamp() default EnumTrafficLamp.RED;
应用枚举类型属性:@MyAnnotation(lamp=EnumTrafficLamp.GREEN)
自定义注解实例:
/**
* 信号灯枚举
* @auther XuXin
* @date 2019/2/11 14:42
*/
public enum EnumTrafficLamp {
RED,//红
GREEN,
WHITE,
}
/**
* @auther XuXin
* @date 2019/2/11 14:41
*/
//添加属性
public @interface MetaAnnotation {
//定义基本属性
String value();//定义一个名称为value的属性
}
//注解更像是一种特殊的接口,注解的属性定义方式就和接口中定义方法的方式一样,
// 而应用了注解的类可以认为是实现了这个特殊的接口
/**
* @auther XuXin
* @date 2019/2/11 17:18
*/
@Retention(RetentionPolicy.RUNTIME)
//Retention注解决定MyAnnotation注解的生命周期
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
String color() default "blue";
/**
* 为注解添加value属性,这个value属性很特殊,如果一个注解中只有一个value属性要设置,
* 那么在设置注解的属性值时,可以省略属性名和等号不写, 直接写属性值,如@SuppressWarnings("deprecation"),
* 这里的MyAnnotation注解设置了两个String类型的属性,color和value,
* 因为color属性指定有缺省值,value属性又是属于特殊的属性,因此使用MyAnnotation注解时
* 可以这样使用MyAnnotation注解:"@MyAnnotation(color="red",value="xdp")"
* 也可以这样使用:"@MyAnnotation("孤傲苍狼")",这样写就表示MyAnnotation注解只有一个value属性要设置,color属性采用缺省值
* 当一个注解只有一个value属性要设置时,是可以省略"value="的
*/
String value();//定义一个名称为value的属性
//添加一个int类型数组的属性
int[] arrayAttr() default {1,2,4};
//添加枚举类型的属性,并指定枚举类型缺省值,,缺省值只能从枚举类EumTrafficLamp中定义的枚举对象中取出任意一个作为缺省值
EnumTrafficLamp lamp() default EnumTrafficLamp.RED;
//为注解添加一个注解类型的属性,并指定注解属性的缺省值
MetaAnnotation annotationAttr() default @MetaAnnotation("xdp");
}
/**
* @auther XuXin
* @date 2019/2/11 17:36
*/
@MyAnnotation(
color = "red",
value="齐心天下",
arrayAttr = {3,4,5},
lamp = EnumTrafficLamp.GREEN,
annotationAttr = @MetaAnnotation("gac1")
)
public class MyAnnotationTest {
@MyAnnotation("将MyAnnotation注解到main方法上")
public static void main(String[] args){
/**
* 检查Annotation类是否有注解,这里需要使用反射完成对Annotation类的检查
*
*/
if (MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
/**
* 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
* MyAnnotation是一个类,这个类的实例对象annotation是通过反射得到的,
* 一旦在某个类中使用了@MyAnnotation,那么这个MyAnnotation类的实例对象Annotation就会创建出来
*/
MyAnnotation annotation=(MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(annotation.color());//默认red
System.out.println(annotation.value());//默认齐心天下
System.out.println(annotation.arrayAttr().length);//数组长度3
System.out.println(annotation.lamp());//输出枚举属性值GREEN
System.out.println(annotation.annotationAttr().value());//输出注解属性gacl
MetaAnnotation ma=annotation.annotationAttr();//annotation是Annotation的实例对象
System.out.println(ma.value());//输出结果gacl
}
}
}
转载链接:转载地址