注解的定义与反射调用

来源:互联网 发布:电影配乐知乎 编辑:程序博客网 时间:2024/06/05 19:41
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

//自定义一个注解
@Retention(RetentionPolicy.RUNTIME)//注解存留时间
@Target({ElementType.METHOD,ElementType.TYPE})//注解使用的地方
public @interface TshAnnotation {
String color() default "blue" ;
String value();
enumTest1 lamp() default enumTest1.GRE;//枚举类型
TshAnnotation1 annot() default @TshAnnotation1("注解类型");//注解类型
}
public @interface TshAnnotation1 { 
String value();
}
//反射调用注解
@TshAnnotation(color = "red", value = "value",annot=@TshAnnotation1("注解参数"))
public class ZhuJie {

public static void main(String[] args) {
if(ZhuJie.class.isAnnotationPresent(TshAnnotation.class)){
TshAnnotation tshannot=ZhuJie.class.getAnnotation(TshAnnotation.class);
System.out.println(tshannot.color());
System.out.println(tshannot.value());
System.out.println(tshannot.lamp().nextLight());
System.out.println(tshannot.annot().value());
}

}
@Deprecated
public static void say(){

}

}
1、@Override定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了
在编译时,会提示以下错误信息: 
2、@Deprecated定义在java.lang.Deprecated中,修饰的方法标示已经过时,编译器会发出警告。
3、@SuppressWarnings定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:
deprecation:使用了过时的类或方法
unchecked:执行了未检查的转换时警告
path:类的路径不存在时警告
serial:当可序列化的类上缺少serialVersionUID定义时警告
all:所有情况警告 
 
Meta-Annotation类型: 
Annotation 类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型,分别是:Target、Retention、Documented、Inherited,它们被用来提供对其它annotation类型作说明。 这些类型和它们所支持的类在java.lang.annotation包中可以找到。 

@Target的用法:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
java.lang.annotation.ElementType是一个枚举类型,它具有以下定义: 
ElementType.METHOD:应用于方法上
ElementType.TYPE:应用类、接口上
ElementType.FIELD:应用字段声明上
ElementType.CONSTRUCTOR:应用构造方法上
 
@Retention的用法:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS
java.lang.annotation.RetentionPolicy是一个枚举类型,它具有以下定义: 
RetentionPolicy.RUNTIME:编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取
RetentionPolicy.CLASS:编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RetentionPolicy.SOURCE:编译器要丢弃的注释。
 
自定义Annotation注释 
1、注释annotation与接口的异同: 
因为annotation类型是一个非凡的接口,所以它与接口之间存在着某些差异: 
A. Annotation类型使用关键字@interface而不是interface,这个关键字声明隐含了一个信息,它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface。 
B. Annotation类型的方法定义是独特的、受限制的,方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用default和一个默认数值来声明成员的默认值,null不能作为成员默认值,这与我们在非annotation类型中定义方法有很大不同。 
C. Annotation类型又与接口有着近似之处,它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。 

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net                                             
0 0
原创粉丝点击