标签:java
一:Java1.5起默认三个annotation类型:
@override 覆盖父类方法的注解
@SuppressWarning 忽略警告
@Deprecated 标记方法过时
二:注解的运用
注解类
@interface A{
}
应用了"注解类"的类
@A
class B{
}
对”应用了注解类的类"进行反射操作的类
class C{
if(B.class.isAnnotationPresent(A.class)){
A a=B.class.getAnnotation(A.class);
}
}
三:为注解添加元注解
1.配置注解的生命周期
@Retention(RetentionPolicy.RUNTIME) //保留到运行期间
@Retention(RetentionPolicy.SOURCE) //保留在Java源文件期间(默认)
@Retention(RetentionPolicy.CLASS) //保留在class文件期间
SO:
@override 保留在SOURCE阶段
@SupressWarning 保留在SOURCE阶段
@Deprecated 保留在RUNTIME阶段
2.配置注解的引用位置
@Target(ElementType.METHOD) //只能在方法上引用
@Target({ElementType.METHOD,ElementType.Type}) //既能在类上添加又能在方法上引用
四:为注解添加属性
@interfaceA{
String color(); //添加属性color
String color() default "blue" ; //设置缺省时的默认值
int[] arrrayAttr(); //添加数组属性 @A(arrayAttr={1,2,3}) //使用时
EnumBase.trafficaLamp lamp() default EnumBase.trafficaLamp.Red; //添加枚举类型属性
MetaAnnotation annotationAttr() default @MetaAnnotation(value="wzl") //添加注解类型的属性
}
Ps:特殊属性 String value();
给属性赋值时,可将value省略。即:@A("red")
五:Java代码测试:
1.测试枚举类型的属性时使用的EnumBase枚举类
// 编写枚举
public class EnumBase {
public static void main(String[] args) {
WeekDay wd = WeekDay.MON;
System.out.println(wd);
System.out.println(wd.name());
System.out.println(wd.ordinal());
System.out.println(WeekDay.valueOf("SUN")); // 将字符串转化为枚举对象
System.out.println(WeekDay.values().length);
System.out.println(trafficLamp.Red.nextLamp());
}
public enum WeekDay {
SUN(1), MON, SAT, TUE;
// 编写构造方法 构造方法必须为私有private类型
private WeekDay() {
System.out.println("first");
}
private WeekDay(int day) {
System.out.println("second");
}
}
// 编写带上抽象方法的枚举
public enum trafficLamp {
// 枚举类熟悉相当于对象,实现抽象方法
Red(30) {
public trafficLamp nextLamp() {
time--;
System.out.println(time);
return Green;
}
},
Yellow(45) {
public trafficLamp nextLamp() {
return Red;
}
},
Green(5) {
public trafficLamp nextLamp() {
return Yellow;
}
};
// 抽象方法
public abstract trafficLamp nextLamp();
// 带参数构造方法
public int time;
private trafficLamp(int time) {
this.time = time;
}
}
}
2.测试注解类型的属性时的MetaAnnotation注解类
public @interface MetaAnnotation { String value(); }
3.编写注解类
/*
* 定义注解类
*/
//元注解
//为注解设置生命周期
@Retention(RetentionPolicy.RUNTIME)
// 为注解设置引用的位置
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface annotationPoint {
// 添加几种类型属性
String color() default "blue"; // 默认缺省属性值
String value(); // 特殊属性名
int[] arrayAttr() default { 1, 2, 3 }; // 数组属性
EnumBase.trafficLamp lamp() default EnumBase.trafficLamp.Red; // 添加枚举属性
MetaAnnotation annotationAttr() default @MetaAnnotation("ww"); // 添加注解类型的属性
}
4.测试注解类中的各个属性
/*
* 应用了"注解类"的类
*/
@annotationPoint(value = "wzl", lamp = EnumBase.trafficLamp.Green, annotationAttr = @MetaAnnotation("wzl"))
public class annotationTest {
public static void main(String[] args) {
// 判断是否是注解类型
if (annotationTest.class.isAnnotationPresent(annotationPoint.class)) {
// 得到注解对象
annotationPoint ap = annotationTest.class
.getAnnotation(annotationPoint.class);
System.out.println(ap);
// 取出注解属性值
System.out.println(ap.color());
// 取出枚举类型的属性的值
System.out.println(ap.lamp().nextLamp());
// 取出注解类型的属性值
System.out.println(ap.annotationAttr().value());
}
}
}
标签:java
原文地址:http://blog.csdn.net/u010366796/article/details/44172595