黑马程序员-注解(Annotation)

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------

注解:一个注解就是一个类,列如,我们在使用一个方法时,有时候编译器会提示我们该方法已过时,我们不想让它提醒,就可以加个注解@SuppressWarnings(deprecation)

这就表示创建了一个SuppressWarnings类,deprecation表示传递给该类value方法的值(下面会讲到)

 

 

小结:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无任何标记,看你有什么标记,就去干像样的事情,标记可以加在包,类,字段,方法的参数以及局部变量上。

 

我们现在根据这个结构来设计三个类

AnnotationA类 ,AnnotationB类,AnnotationC

 

AnnotationA

public @interface AnnotationA {
 
}

AnnotationB

@AnnotationA
public class AnnotationB {
 
}

AnnotationC

public class AnnotationC {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		if (AnnotationB.class.isAnnotationPresent(AnnotationA.class)) {
			AnnotationA A = AnnotationB.class.getAnnotation(AnnotationA.class);
			System.out.println(A);
		}

	}

}

但是控制台并没有任何反应,这说明,在AnnotationC类中,并没有执行if里面的语句,说明判断结果为fasle,为什么会发生这种情况呢?

 

修改AnnotationA类中的代码:

截图:

 

输出了想要的结果,那么这条代码到底是什么意识呢?

@Rentention()元注解有三种取值范围:

RententionPolicy.SOURCE:   对应java源文件

RententionPolicy.CLASS:  对应class文件(默认取值)

RententionPllicy.RUNTIME: 对应内存中的字节码

写到这里,我们再来看一下比较常用的三个注解类,其Rentention的取值分别是什么:

1、@Deprecated     @Rentention的取值是RententionPolicy.RUNTIME

2、@SuppressWarnints(deprecation)                    RententionPolicy.SOURCE

3、@Override                                         RententionPolicy.SOURCE

 

 

接下来我们来看Target元注解  

1、@Target(ElementType.METHOD)括号中的参数本应是一个数组,若只传入一个,可以简写,这个注解的目的是说明该注解只能加在方法上

2、@Target[ElementType.METHOD,ElementType.TYPE])  既可以加在方法上,也可以加在类上(TYPEclassinterfaceenum的父接口)

  

 

还可以为注解增加属性:

列如:1、在注解类AnnotationA类中增加属性(方法):String color();

2、在AnnotationB上标记   @AnnotationAcolor=red”)

3、在AnnotationC中  AnnotationA  A=AnnotationAAnnotationB.class.getAnnotation(Annotation.class);

 System.out.println(AnnotationA.color());

另外,还可以为属性指定缺省值:

String color()  default  yellow;

Value属性

  String value() default zxx;

 如果注解中只有一个value属性,可以简写 @AnnotationA(“abc”)

  数组类型的属性:

Int[] arrayAttr() default {1,2,3};

@AnnotationA(arrayAttr(2,3,4)),如果数组属性中只有一个元素,这时候属性值部分可以省略大括号,eg:  @AnnotationAarrayAttr=2

 

 

枚举类型的属性:

 (需要用到前面定义的交通灯)

EnumTest.TrafficLamp   lamp();

@AnnotationA(lamp=EnumTest.TrafficLamp.GREEN)

 

注解类型的属性:
列如我们再定义一个注解类型MetaAnnotation

MetaAnnotation  annotationAttr() default @MetaAnnotation(“xxx”);

@AnnotationAannotationAttr=@MetaAnnotation(“yyy”))

 

测试:


AnnotationA

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationA {
	AnnotationD annotationAttr() default @AnnotationD("xyz");

}

AnnotationC

AnnotationA A=AnnotationB.class.getAnnotation(AnnotationA.class);
System.out.println(A.annotationAttr()); 


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值