注解的使用
注解是JDK1.5有的
应用注解,进行开发和应用:
注解相当于一个特殊的类哦!
首先定义一个注解的类 @interface toov5
然后应用这个注解 @A
然后对这个类进行反射调用
一个注解的生命周期有三个阶段:
1、 RetentionPolicy.RUNTIME
2 、 RetentionPolicy.SOURCE
3、 RetentionPolicy.CLASS
分别对应Java源文件 calss文件(通过类加载器调用进内存就没有了,比如 @Override等) 内存中的字节码 这三个阶段都可以将注解去掉。 设计时候可以进行声明
总结: 注解用在哪个阶段、什么类型(方法、类、包、注解、构造方法等)上面。
元注解以及其枚举属性值不用记,直接看java.lang.annotation包下面的类
做一个注解:
@Retention(RetentionPolicy.RUNTIME) //为注解服务的 元注解 保留到运行期间
//@Target(ElementType.METHOD) //只能放在Method上不能放在类上
@Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
public @interface toov5 {
}
使用它:
@toov5
public class test1 {
public static void main(String[] args) {
//玩字節碼,看看有注解沒 注解是否在場
boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
if (annotationPresent){ //如果有这个注解
toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
System.out.println(annotation);
}
}
}
注解的属性相当于一个胸牌,比如实验中学学生。如果再想细致的区分,那么可以通过这个胸牌再加一个属性区分。
@MyAnnotation(color = "red")
可以有默认值:
@Retention(RetentionPolicy.RUNTIME) //为注解服务的 元注解 保留到运行期间
//@Target(ElementType.METHOD) //只能放在Method上不能放在类上
@Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
public @interface toov5 {
String color() default "red"; //抽象的并且是public的 指定一个属性默认值
String value();
}
测试:
@toov5(value = "test") // 创建这个注解的实例对象时候需要给属性赋值
public class test1 {
public static void main(String[] args) {
//玩字節碼,看看有注解沒 注解是否在場
boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
if (annotationPresent){ //如果有这个注解
toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
System.out.println(annotation.color()+"-----"+annotation.value()); //打印这个注解属性 取值时候还是以方法调用的形式进行调用
}
}
}
属性复杂一些的比如 数组类型的:
注解:
@Retention(RetentionPolicy.RUNTIME) //为注解服务的 元注解 保留到运行期间
//@Target(ElementType.METHOD) //只能放在Method上不能放在类上
@Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
public @interface toov5 {
String color() default "red"; //抽象的并且是public的 指定一个属性默认值
String value();
int[] arrayAttr() default {1,6};
}
使用:
@toov5(value = "test", arrayAttr = {1,3,6}) // 创建这个注解的实例对象时候需要给属性赋值
public class test1 {
public static void main(String[] args) {
//玩字節碼,看看有注解沒 注解是否在場
boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
if (annotationPresent){ //如果有这个注解
toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
System.out.println(annotation.color()+"-----"+annotation.value()); //打印这个注解属性 取值时候还是以方法调用的形式进行调用
System.out.println(annotation.arrayAttr().length);
}
}
}
结果:
属性的值可以使注解的!
另外写一个注解:
public @interface toov5Annotation {
String value();
}
注解中引用这个注解:
@Retention(RetentionPolicy.RUNTIME) //为注解服务的 元注解 保留到运行期间
//@Target(ElementType.METHOD) //只能放在Method上不能放在类上
@Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
public @interface toov5 {
String color() default "red"; //抽象的并且是public的 指定一个属性默认值
String value();
int[] arrayAttr() default {1,6};
//返回注解
toov5Annotation toov5Annotation() default @toov5Annotation("toov5"); //默認值
}
测试:
@toov5(value = "test", arrayAttr = {1,3,6} , toov5Annotation = @toov5Annotation("ttttttest")) // 创建这个注解的实例对象时候需要给属性赋值
public class test1 {
public static void main(String[] args) {
//玩字節碼,看看有注解沒 注解是否在場
boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
if (annotationPresent){ //如果有这个注解
toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
System.out.println(annotation.color()+"-----"+annotation.value()); //打印这个注解属性 取值时候还是以方法调用的形式进行调用
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.toov5Annotation().value());
}
}
}
结果:
属性也可是是枚举类的!
略
也可以是class! 略