黑马程序员:注解(Annotation)介绍

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

注解|注释(Annotation),每个注解都对应一个类

1.@SuppressWarnings 压缩警告注解
示例:
System.runFinalizersOnExit(true); //该方法已过时(deprecated)
当含有这条语句的代码被编译后,javac会提示注意信息。若:
@SuppressWarnings
System.runFinalizersOnExit(true); 
则不会出现注意提示。

2.@Deprecated 弃用注解
若一个方法已经被弃用,而这个方法又被很多人调用时,因为不能删除该方法,所以可以在这方法上通过添加@Deprecated注解此方法已被弃用,这样当之后想要调用该方法的人就会知道该方法已被弃用。
示例:
@Deprecated
public void show() {
code;
}
//在eclipse中,show()上会出现删除线,而别人再调用show()时,也会出现删除线,已表示该方法已被弃用
3.@Override  覆盖注解
当使用这个注解时,注解下的方法若没有覆盖父类方法,则会出现错误提示,以便程序员正确覆盖父类方法,是一个帮助检查覆盖是否有错的好工具
示例:
@Override
public boolean equals(String str) {
code;
}
上面的示例在eclipse中就会出现错误提示,因为equals中的参数并不是Object类型,所以不会覆盖其父类也就是Object类中的equals方法

总结:
注解相当于一种标记,在程序中加了注解就等于加上了某种标记,没加,则等于没记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事(例如eclipse对过时的方法会自动加上删除线)。标记可以加在包、类、字段、方法、方法的参数以及局部变量上。
以上几种基本的注解方式可以通过API中的java.lang包查看(annotation)

自定义注解:
public @Interface MyAnnotation {}
把该注解加载某个类上:
@MyAnnotation
public class AnnotationTest {}
通过反射来察看AnnotationTest类上是否有MyAnnotation注解:
if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class))
{
MyAnnotation an = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(an); //这个时候没有任何结果
}
通过以上代码发现,注解保留是有时间限制的,默认保留到class,让类加载加载class的时候注解就被去掉了,那么如何让注解保留到运行时呢
下面看Retention类(元注解):
如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS
Retention有三种取值:
RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME
分别对应:java源文件-->class文件-->内存中的字节码
若在MyAnnotation注解上再加上@Retention(RetentionPolicy.RUNTIME),那么上面的例子就能打印出注解的相关信息
示例:
@Retention(RetentionPolicy.RUNTIME)
public @Interface MyAnnotation {}

@Override:保留在SOURCE
@SuppressWarnings:保留在SOURCE
@Deprecated:保留在RUNTIME

定义注解作用域:若不声明,则可以用在任何元素上
@Target()
两种方式:
作用域单一:
@Target(ElementType.ANNOTATION_TYPE) //作用在注解上
作用域多个:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE}) //可以在字段,方法,类上添加对应的注解

示例:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
public @Interface MyAnnotation {}

@MyAnnotation 的作用周期到RUNTIME,可以在字段(成员变量)、方法、类上使用该注解
更多作用范围可以查看API文档中的枚举类ElementType

为注解增加基本属性
什么是注解的属性:
一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则就不是,如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分,加了属性的标记效果为:@MyAnnotation(color="red")
定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")

用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法:
MyAnnotatio n an = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(an.color()); 
可以认为上面的@MyAnnotation是MyAnnotation类的一个实例对象
为属性指定缺省值:
String color() default "yellow";

value属性:
String value() default "zxx";

示例:

public @interface MyAnnotation {
String color();
String value();
}
那么
@MyAnnotation(color="red",value="deprecation")

若注解类中只需要给value属性赋值时,则可以写成


public @interface MyAnnotation {


String color() default "red";
String value();
}

@MyAnnotation("deprecation")
value属性是一个特殊的属性


为注解增加高级属性


1.数组类型的属性:
int[] arrayAttr() default{1,2,3};
@MyAnnotation(arrayAttr={1,2,3})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括号


2.枚举类型的属性:
若代码如下:
public enum TrafficLamp
{
	//枚举类中,所有元素(实例对象)都要覆盖抽象方法,所以通过匿名内部类的方式覆盖
	RED(40,"红灯"){
		public TrafficLamp nextLamp(){
			return GREEN;
		}
	},GREEN(45,"绿灯"){
		public TrafficLamp nextLamp(){
			return YELLOW;
		}
	},YELLOW(5,"黄灯"){
		public TrafficLamp nextLamp(){
			return RED;
		}
	};
	private int time;
	private String str;
	private TrafficLamp(int time,String str) {
		this.time = time;
		this.str = str;
	}
	public abstract TrafficLamp nextLamp();
	public void show()
	{	
		System.out.println(str);
	}


}
class EnumDemo
{
	public static void main(String[] args) {
		TrafficLamp red = TrafficLamp.RED;
		red.show();
	}
}

则枚举类型的属性格式为:
EnumTrafficLamp lamp();
@MyAnnotation(lamp=EnumTrafficLamp.RED)


3.注解类型的属性:
假设有一个自定义注解MetaAnnotation,该自定义注解中有一个属性为value();
代码:
public @interface MetaAnnotation {
String value();
}
再添加注解类型属性的时候,格式为:
MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");
@MyAnnotation(annotationAttr=@MetaAnnotation("yyy"))
可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,同样的道理,可以认为@MetaAnnotation是MetaAnnotation类的一个实例对象


注解的详细语法可以通过看Java语言规范了解,即Java的Language specification---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值