12

来源:互联网 发布:购物车数据库表设计 编辑:程序博客网 时间:2024/05/16 19:44
JDK1.5新特性:注解(Annotation)
注解及Java的几个基本注解
注解1.@Deprecated--方法过时
一个方法创建后,后期可能会将该方法过时处理,不过不能删除该方法,因为有的用户可能还在使用该方法所以可使用注解声明该已经过时。

@Deprecated
    public static void sayHello() {
       System.out.println("hi,传智播客");
    }
注解2.@Override--覆盖(重写)父类的方法。
如果没有覆盖父类方法,Eclipse会提示错误,如下,本来是想覆盖父类的toString方法,结果多写的一个字符s,所以Eclipse提示错误:

@Override
    public String tosString() {
       return null;
    }
注解3.@SuppressWarnings--去除过时的API警告。
当使用过时的方法时,Eclipse会给该方法划线,并提示过时。在命令行中编译带有过时方法的类,会有警告提示,使用注解可以去掉该警告。

@SuppressWarnings("deprecation")
    public static void main(String[] args) {
       System.runFinalizersOnExit(true);

    }

总结:注解相当于一个标记,在程序中加了注解就等于给程序打上某种标记。javac编译器、开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,就可以干相应的事,例如对于过时的方法,就划上删除线。注解可以加在包、类、字段、方法、方法参数以及局部变量上。在java.lang包下通过了最基本的annotation。

注释应用结构图:
注解类@interface A{}  
应用注解类@A
    Class B{}
对应用注解类进行反射操作的类Class C{
B.class.isAnnotionPerson(A.class);
A a = B.class.getAnnotion(A.class);
}
注解分三个阶段生命周期:即class文件阶段、源文件阶段、运行阶段(内存中字节码阶段)。
如:(   @Override、@SuppressWarnings)注解都是保留在源文件阶段。而@Deprecated注解保留到运行阶段。
@Retention
源文件:@Retention(RetentionPolicy.SOURCE)

class文件:@Retention(RetentionPolicy.SOURCE)
内存字节码:@Retention(RetentionPolicy.SOURCE)
@Target::用于说明该注解类只能使用在某种成分上。如:
@Target(ElementType.METHOD):表示注解类只能使用在方法上,如果不是使用在方法上,就会报错。
@Target(ElementType.TYPE):表示注解类只能使用在类上。
@Target({ElementType.TYPE, ElementType.METHOD})表示注解类既能使用在类上,也能使用在方法上。

主函数
//使用注解类
@ItcastAnnotation
public class AnnotationDemo {
   
    public static void main(String[] args) {
       //检查AnnotationDemo类上是否存在注解ItcastAnnotation
       if(AnnotationDemo.class.isAnnotationPresent(ItcastAnnotation.class)) {
           //获得注解
           ItcastAnnotation annotation = (ItcastAnnotation) AnnotationDemo.class.getAnnotation(ItcastAnnotation.class);
           System.out.println(annotation);
       }
    }
}
//元注解:(注解的注解) 该注解是在注解类上添加的,所以叫元注解,这里是表示注解的的生命周期在runtime。
//java编译器在编译java文件时,会把注解去除掉,运行时这些注解就不存在了,为了让这些在运行时存在,所以使用上述的注解,告诉编译器将这些注解保留到class文件中。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
//注解类
public @interface ItcastAnnotation {
}

为注解增加基本属性
个注解相当于学生的一个胸牌,如果你贴的胸牌就是传智播客的学生,如果没有胸牌就不是。如果还想区分出是传智播客的哪个班,这时候就可以为胸牌增加属性来进行区分,加了属性的标记效果为@MyAnnotation(color=”red”)
定义基本类型的属性和应用属性:
在注解类中增加String color();使用属性@MyAnnotation(color=”red”)         用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);System.out.println(a.color());可以认为上面这个@MyAnnotation是 MyAnnotation类的一个实例对象。为属性指定缺省值:String color()default"yellow";value属性:String value()default"zl";
如果注解中有一个名称为value的属性,你只想设置value属性。,那么可以省略value=部分。如:@MyAnnotation("zy")。
为注解增加高级属性
数组类型的属性
int[] arrayAttr() default{1,2,3};
@MyAnnotation(arrAttri={2, 3, 4})
如果数组是属性只有一个元素,只适合属性值部分可以省略大括号。数组类型注解也可以指定默认值。
枚举类型的属性
EnumTest.TrafficLamp lamp();
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

注解类型的属性
MetaAnnotationannotationAttri() default @MetaAnnotation(“xxx”)
@MyAnnotation(annotationAttri=@MetaAnnotation(“yyy”))

可以认为上面@MyAnnotation是MyAnnotation类的一个实例对象,同样道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类第一个实例对象。
MetaAnnotation ma = myAnnotation.annotationArrti();

System.out.println(ma.value());


注意:注解的返回值类型只能是:8个基本数据类型、String类型、class类型、枚举类型、注解类型,还可以是这些类型的数组类型。如果不是这些类型,编译器就会报错。
0 0
原创粉丝点击