----------------------Android培训、Java培训、期待与您交流! ----------------------
【注解】
注解相当于一种标记,在程序中加了注解就相当于为程序打上了某种标记,以后Javac编译器,开发工具和其他程序可以用反射来来了解你的类和各种元素上有无何种标记,并根据标记,做出相应的处理。标记可以加在包,类,方法,方法的参数,成员变量,局部变量上。
【Java提供的几个基本注解】
@SuppressWarnings
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
如:若一个方法中调用了过时的方法,则在用javac编译时,会输出提示信息,可用该注解取消提示信息
@SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); }
@ Deprecated
用 @Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。
@Deprecated public static void sayHello() { System.out.println("hello java"); }
@ Override
表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
如:某个类中覆盖Object类的hashCode方法
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; }
【Java提供的几个元注解】
@Retention
指示注释类型的注释要保留多久。如果注释类型声明中不存在Retention注释,则保留策略默认为RetentionPolicy.CLASS。该注解有三个取值:RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME,分别对应Java源文件àclass文件à内存中的字节码
RetentionPolicy.SOURCE:编译器要丢弃的注释。
RetentionPolicy.CLASS:编译器将把注释记录在类文件中,但在运行时 VM不需要保
留注释。
RetentionPolicy.RUNTIME:编译器将把注释记录在类文件中,在运行时 VM将保留注释,因此可以反射性地读取。
如:
@Override该注解的元注解有@Retention(value=SOURCE)即该注解在编译器编译时就被丢弃了。
@Deprecated该书姐的元注解有@Retention(value=RUNTIME)即该注解将保留在运行时。
@Target
指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。该注解有以下这几个值:
ElementPolicy.ANNOTATION_TYPE:注解类型声明
ElementPolicy.FIELD:字段声明
ElementPolicy.METHOD:方法声明
ElementPolicy.PACKAGE:包胜明
ElementPolicy.PARAMETER:参数声明
ElementPolicy.LOCAL_VARIABLE:局部变量声明
ElementPolicy.CONSTRUCTOR:构造方法声明
ElementPolicy.TYPE:类、接口(包括注解类型)或枚举声明
如:@Override该注解的元注解有@Target(value=METHOD)即该注解只能用在方法上。
【注解的应用】
注解就相当于你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好这个注解类。就像你要调用某个类,得保证这个类事先存在。
注解的应用结构图:
例:
自定义注解类
//该注解可用在类上,接口上,枚举上和方法上 @Target({ElementType.TYPE,ElementType.METHOD}) //该注解一直保留到运行 时 @Retention(RetentionPolicy.RUNTIME) public @interface ItcastAnnotation { }
为程序添加注解
@ItcastAnnotation public class AnnotationTest { public static void main(String[] args) { if (AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { ItcastAnnotation annotation = (ItcastAnnotation) AnnotationTest.class .getAnnotation(ItcastAnnotation.class); System.out.println(annotation); } } }
【为注解添加属性】
注解就相当于是一个胸牌,表示你是某个学校的学生,但要确定是那个班里的学生,这时候可以为胸牌添加属性来加以区分。注解的属性类型有八个基本数据类型,String,Class,枚举,注解,以及前面这几种类型的数组。
添加属性的步骤为:
-
在注解类中添加属性,可赋初值,如:Stringcolor();或String color() default “blue”;
-
在声明注解时赋值,若有初值,则可以不赋值,如@ItcastAnnotation(color=”red”)
value属性
value属性是注解中一个比较特殊的属性。如果注解中有该属性,且其他属性都有默认值,则声明该注解时可以省略”value=”部分,如:@MyAnnotation(“lhm”)
数组类型的属性
int arr() default {1,2,3};
@MyAnnotation(arr={4,5,6})
如果数组属性中只有一个元素,这时可以省略大括号部分,即@MyAnnotation(arr=8)
枚举类型的属性
EnumTest.TrafficLamplamp();
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
枚举和注解都是特殊的类,不能用new创建它们的实例对象,创建枚举的实例对象就是在其中添加元素。
注解类型的属性
MetaAnnotation注解的定义:
public@interface MetaAnnotation{
Stringvalue;
}
为@MyAnnotation注解添加MetaAnnotation注解属性
MetaAnnotationmAnno default @MetaAnnotation(“java”);
声明注解时
@MyAnnotation(mAnno=@MetaAnnotation(“annotation”))
----------------------Android培训、Java培训、期待与您交流! ----------------------