您的位置:首页 > 职场人生

黑马程序员---java几个基本的注解的使用

2012-02-24 23:00 477 查看
------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! --------------


几个基本的注解
l @SuppressWarnings

Ø 通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")

l @Deprecated

Ø 直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。

l @Override

Ø publicboolean equals(Reflect other)方法与HashSet结合讲解

l 总结:

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

Ø 看java.lang包,可看到JDK中提供的最基本的annotation。

示例:

packagecn.itcast.day2;
//注解
public class AnnotationTest {

@SuppressWarnings("deprecation")//抑制过时声明,但是eclipse不会取消双横线,但运行的时候,不会声明
public static void main(String[] args){
System.runFinalizersOnExit(true);
}

@Deprecated//声明此方法已经过时
public String sayHallo(){
return "你好";
}
@Override//声明是覆盖该父类的方法,如果没正确覆盖,程序会报错
public String toString() {
return null;
}

}

1、自定义注解及其应用
2、定义一个最简单的注解:public @interfaceMyAnnotation {}
3、把它加在某个类上:@MyAnnotation public classAnnotationTest{}
4、用反射进行测试AnnotationTest的定义上是否有@MyAnnotation

5、根据发射测试的问题,引出@Retention元注解的讲解,其三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
思考:@Override、@SuppressWarnings和@Deprecated这三个注解的属性值分别是什么?@Retention(value=SOURCE), @Retention(value=SOURCE), @Retention(value=RUNTIME)

6、@Target元注解
l Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。
7、元注解以及其枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接看java.lang.annotation包下面的类。

2、为注解增加基本属性

l 什么是注解的属性

Ø 一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")

l 定义基本类型的属性和应用属性:

Ø 在注解类中增加String color();

Ø @MyAnnotation(color="red")

l 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法

Ø MyAnnotationa = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

Ø System.out.println(a.color());

Ø 可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象

l 为属性指定缺省值:

Ø Stringcolor() default "yellow";

l value属性:

Ø Stringvalue() default "zxx";

Ø 如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。

示例

1、package cn.itcast.day2;
public @interface MetaAnnotation {
String value();
}
2、package cn.itcast.day2;
importjava.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itcast.day1.EnumTest;

@Retention(RetentionPolicy.RUNTIME)//指示注释类型的注释要保留多久。
// 枚举RetentionPolicy:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
@Target({ElementType.METHOD,ElementType.TYPE})
//指示注释类型所适用的程序元素的种类。ANNOTATION_TYPE注释类型声明,CONSTRUCTOR构造方法声明,FIELD 字段声明(包括枚举常量),LOCAL_VARIABLE局部变量声明,METHOD方法声明
//PACKAGE包声明, PARAMETER 参数声明,TYPE类、接口(包括注释类型)或枚举声明
public @interface ItcastAnnotation {
String color() default "blue";//问注解添加属性,可设置默认值
String value();
int[] arrayAttr() default {2,3,4};
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");//annotationAttr注解属性值
}

3、packagecn.itcast.day2;
//注解
@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"), color="red",value="abc",arrayAttr={1,2,3})//等于一个对象
public class AnnotationTest {

@SuppressWarnings("deprecation")//抑制过时声明,但是eclipse不会取消双横线,但运行的时候,不会声明
@ItcastAnnotation("xyz")
public static void main(String[] args)
throws
Exception{
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);//判断类中是是否含有注解
System.out.println(annotation.color()+":::"+annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.annotationAttr().value());
}
}
}
------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! -------------

详情请查看:http://edu.csdn.net/heima/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: