高新技术-JDK1.5新特性之注解
在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道。以Java EE中典型的S(pring)S(truts)H(ibernate)架构来说,Spring、Struts和Hibernate这三个框架都有自己的XML格式的配置文件。这些配置文件需要与Java源代码保存同步,否则的话就可能出现错误。而且这些错误有可能到了运行时刻才被发现。把同一份信息保存在两个地方,总是个坏的主意。理想的情况是在一个地方维护这些信息就好了。其它部分所需的信息则通过自动的方式来生成。JDK 5中引入了源代码中的注解(annotation)这一机制。注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。Java注解已经在很多框架中得到了广泛的使用,用来简化程序中的配置。
package cn.itcast.day2;
public class AnnotationTest {
/**类名都是名词或形容词加名词
* 方法名都是动词加名词或动词
* @param args
*/
@SuppressWarnings("deprecation")//压缩警告,是向编译器发送消息
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
Thread thread=new Thread();
thread.stop();
sayHello();
}
@Deprecated
public static void sayHello(){
System.out.println("hi,传志播客");
}
}
注解可以加在包,类,成员变量,构造器,方法,方法的参数和局部变量上
注解的默认生存周期为编译时期Retention(RetentionPolicy.CLASS)
注解的生存周期有三种CLASS,RUNTIME,SOURCE
Deprecated @Retention(RetentionPolicy.RUNTIME)
Override @Retention(RetentionPolicy.SOURCE)
SupperessWarnings @Retention(RetentionPolicy.SOURCE)
package cn.itcast.day2;
public @interface MetaAnnotation {
String value();
}
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;
@Retention(RetentionPolicy.RUNTIME)
// 原注解,这是说下面这个注解要保留到运行时期
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD })
public @interface ItcastAnnotation {
String color() default "yellow";
// 为注解添加属性,其实根接口是差不多的
String value();
// 当注解中只有一个属性value时,那么 在用的时候可以这么写 @ItcastAnnotation("111");
int[] arrayattr() default {2,3,4};
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationattr() default @MetaAnnotation("lhm");
Class<?> classattr() default ItcastAnnotation.class;
}
package cn.itcast.day2;
import java.util.Arrays;
import cn.itcast.day1.EnumTest;
@ItcastAnnotation(color = "red", value = "xyz", arrayattr = { 1, 2, 3 }, lamp = EnumTest.TrafficLamp.GREEN,
annotationattr = @MetaAnnotation("flx"), classattr = AnnotationTest.class)
public class AnnotationTest {
/**
* 类名都是名词或形容词加名词 方法名都是动词加名词或动词
*
* @param args
*/
@SuppressWarnings("deprecation")
// 压缩警告,是向编译器发送消息
@ItcastAnnotation("abc")
// 当注解中只有一个value属性需要设置,那么就可以这样写,当数组属性中只有一个值时可以这样写arrayattr=1
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
Thread thread = new Thread();
thread.stop();
sayHello();
if (AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) {
ItcastAnnotation annotation = AnnotationTest.class
.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(Arrays.toString(annotation.arrayattr()));
System.out.println(annotation.lamp());
System.out.println(annotation.annotationattr().value());
System.out.println(annotation.classattr().getName());
}
}
@Deprecated
public static void sayHello() {
System.out.println("hi,传志播客");
}
}