33 了解和入门注解的应用
Spring 基于注解
枚举 注解 jdk1.5以后的两个新特性。反射不是1.5后才出来的。
先通过@SuppressWarning的应用让大家直观地了解注解:
通过System.runFinalizersOnExit(true);的编译警告引出
//强制取消过时提示。
@SuppressWarning("deprecation")
//过时提示。
@Deprecated
直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个
方法。
@Override //标注覆盖父类的方法。
public boolean equals(Reflect other)方法与HashSet结合讲解
总结
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种
标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及个中元素上有无何种
标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及
局部变量上。
看java.lang包,可看到jdk中提供的最基本的Annotation.
1. @deprecated,如果想声明该办法已经不建议采用,那么可以在注释的地方加上@deprecated就行。 2. @SuppressWarnings , 批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。 |
----------------------------------------------------------------------------
34 注解的定义与反射调用
注解就相当于一个你的源程序中调用的一个类,要在源程序中应用某个注解,得闲准备好了这个注解类。
就像你要调用某个类,得闲有开发好这个类。
--------------------------------------------------------------------
35 为注解增加基本属性
什么是注解的属性
一个注解相当于一个胸牌,如果胸前贴了胸牌,就是传智播客的学生,否则就不是。如果
还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了
属性的标记效果为:@MyAnnotation(color="red")
定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")
用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation) MyAnnotationTest.class.getMyAnnotation(MyAnnotationTest.class);
System.out.pringln(a.color());
可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象
为属性指定缺省值
String color() default "yellow";
value属性:
String value() default "zxxx";
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者)
为注解增加高级属性
数组类型的属性
int[] arrayAttr() default{1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括号。
枚举类型的属性
EnumTest.TrafficLamp lamp();
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotation AnnotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation("YYY"))
可以认为上面这个@MyAnnotation是MetaAnnotation类的一个实例对象,同样的道理,
可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaMyAnnotation ma = myAnnotation.annotationAttr();
练习代码:
//元注解
package cn.itcast.day2;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itcast.day1.EnumTest;
//VM将在运行时也保留注解,这样才可以通过反射机制读取注解的信息
@Retention(RetentionPolicy.RUNTIME)
//表示该注解可以在方法成员,和类型之上声明注解
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface ItcastAnnotation {
//为注解添加属性
String color() default "red";
String value() default "我是注解中的value值"; //为属性提供默认值
int[] arrayAttr() default {1, 2, 3};
//枚举注解
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
//注解当中的注解。
MetaAnnotation annotationAttr() default @MetaAnnotation("caodage");
}
package cn.itcast.day2;
import cn.itcast.day1.EnumTest;
@ItcastAnnotation(color="blue",value="bcd",arrayAttr={1,2},lamp=EnumTest.TrafficLamp.YELLOW,annotationAttr=@MetaAnnotation("自定义注解"))
public class AnnotationTest {
/**
* @param args
*/
@SuppressWarnings("deprecation")
//@ItcastAnnotation(color = "")
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
//用反射方式检查@ItcastAnnotation这个注解在不在。
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().name());
System.out.println(annotation.annotationAttr());
}
}