---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、了解java提供的三个基本注解
package com.cn.itcast;
public class AnnotationTestDemo {
@SuppressWarnings("deprecation")//若想编译器不警告,则通过该注解忽略“过时”这类警告
public static void main(String[] args) {
System.runFinalizersOnExit(true); //调用已过时的方法时,编译器会警告
}
@Deprecated //认为该方法已过时后,通过该注解,既让老用户仍能调用该方法,又让新用户明白该方法不值得再用
public static void sayHello(){
System.out.println("hi!");
}
@Override //通过该注解,明确该方法是重写父类的同名方法;避免了重载的情况
public String toString(){
return null;
}
}
总结:
注解相当于一种标记,程序加了注解就等于打上了某种标记,没加则等于没有某种标记。java编译器、开发工具及其他程序可以用反射的方式了解你的类及各种元素上是否有何种标记,根据你拥有的标记执行相应的操作。
标记可以加在包、类、成员变量、方法、局部变量上。
二、注解的应用结构图
注意:注解相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好这个注解类。
三、自定义注解及其应用
/*
*自定义一个ItcastAnnotation注解
*/
package com.cn.itcast;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//元注解,注解的注解
//让该注解保留到运行时;若值为RetentionPolicy.SOURCE或RetentionPolicy.CLASS,
//则AnnotationDemo用反射测试时,会认为类上没有注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})//让该注解可以定义在方法上与TYPE(类、接口、枚举、注解等)上
public @interface ItcastAnnotation {
}
/*
* 将自定义注解分别加到类上;
* 用反射测试AnnotationTest类上是否有@ItcastAnnotation注解
*/
package com.cn.itcast;
@ItcastAnnotation
public class AnnotationDemo {
public static void main(String[] args)throws Exception {
if (AnnotationDemo.class.isAnnotationPresent(ItcastAnnotation.class)){//判断类上是否有@ItcastAnnotation注解。
ItcastAnnotation annotation=(ItcastAnnotation)AnnotationDemo.class.getAnnotation(ItcastAnnotation.class);//获得该@ItcastAnnotation注解
System.out.println(annotation);
}
}
}
总结:
1)@Rention:
它是元注解,即注解的注解,它规定了注解的保留时间。
它有三个值,分别是:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME,分别代表:
注解保留到源文件期间、注解保留到Class文件期间;注解保留到运行期间。
注意:@Override为RetentionPolicy.SOURCE,@SuppressWarnings为RetentionPolicy.SOURCE,而@Deprecated为RetentionPolicy.RUNTIME。
2)@Target:
它也是元注解,它规定了注解的放置位置。
它的值为ElementType[]类型,里面的元素可以为ElementType.METHOD、ElementType.TYPE等,分别代表可以放在方法上,可以放在类上。
3)元注解以及其枚举属性值可以不用记忆,它们可以通过IDE的自动补足功能获得。我们只需要有所了解,能够通过java三个基本注解找到这些元注解即可。
四、为注解增加高级属性
package com.cn.itcast;
public @interface MetaAnnotation {
String value();
}
package com.cn.itcast;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//元注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
String color() default "yellow";//定义属性,设置默认值
String value(); //特殊的属性
int[] arrayAttr() default {2,3,4};//数组类型的属性
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//枚举类型的属性
MetaAnnotation annotationAttr() default @MetaAnnotation("dde");//注解类型的属性
}
/*
* 将自定义注解分别加到类和方法上;
* 用反射测试AnnotationTest类上是否有@ItcastAnnotation注解
*/
package com.cn.itcast;
@ItcastAnnotation("abc")//因为其他属性都有默认值,只设置value的值时,可以忽略属性名,直接赋值
public class AnnotationTest {
//设置注解的属性时像变量一样赋值,分别设置String、int[]、注解、枚举类型的属性的值
@ItcastAnnotation(color="red",value="kkk",arrayAttr={1,2,3},annotationAttr=@MetaAnnotation("lll"),lamp=EnumTest.TrafficLamp.YELLOW)
public static void main(String[] args) {
if (AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) {
ItcastAnnotation annotation=(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
//获取注解的属性时,则是调用方法的形式
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp());
System.out.println(annotation.annotationAttr().value());
}
}
}
输出结果:
yellow
abc
3
GREEN
dde
总结:
1)定义注解的属性时是抽象方法形式,可以设定默认值;设置注解的属性类似给变量赋值的形式;获取注解的属性是调用方法的形式。
2)value属性是比较特殊的属性,当注解中只有该属性需要设置时,可以忽略属性名,直接赋值。
3)int[]类型的属性,在设置时,若只有一个元素时可以忽略大括号,例如,
@ItcastAnnotation(arrayAttr=1)
4)枚举类型的属性:
枚举的实例对象就是它里面的元素。
5)注解类型的属性:只有注解类前面加上@,就表示一个该注解类的实例对象。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com