了解注解:
注解相当与一种标记,在程序中加入了注解就等于为程序打上了某种标记,没加的话就等于没有某种标记,以后javac编译器或开发工具以及其它程序可以用反射来了解你的类及各种元素上有无哪种标记,根据标记去干相应的事。
标记可以加载包、类、字段、方法、方法的参数、局部变量上。
Java提供的几个基本注解
@SuppressWarnings
例如可以用@SuppressWarnings("deprecation") 给编译器一条指令,取消使用了不赞成使 用的类或方法时的警告。
@Deprecated
在方法前标注,这个方法或类不再建议使用。
@Override
在方法前标注,说明这个方法是重载方法。
注解的应用结构:
注解就相当于一个你的源程序中调用的一个类,要在远程戏中应用某个注解,要先准备好这个注解类,就像你要调用某一个类,得先开发好这个类。
注解保留的生命周期,这就要用到@Retention元注解。
@Retention元注解,取值:
RetentionPolicy.SOURCE -> java源文件
RetentionPolicy.CLASS -> class文件 (默认)
RetentionPolicy.RUNTIME -> 内存中的字节码
用于加在自定义注解上:
@Retention(RetentionPolicy.RUNTIME) 表示自定义注解运行周期在运行时阶段。
@Override -> RetentionPolicy.SOURCE
@SuppressWarnings -> RetentionPolicy.SOURCE
@Deprecated -> RetentionPolicy.RUNTIME
注解可以用在哪个成分上,要用到@Target元注解。
枚举常量摘要 |
ANNOTATION_TYPE |
CONSTRUCTOR |
FIELD |
LOCAL_VARIABLE |
METHOD |
PACKAGE |
PARAMETER |
TYPE |
例如:@Target({ElementType.METHOD,ElementType.TYPE})表示自定义注解可以用在方法和变量上。
元注解一届枚举属性值查看JDK文档提供的那几个基本注解的API帮助文档的定义或源代码或直接看java.lang.annotation包下面的类。
例子:
package cn.cast.day2;
/*
ItcastAnnotation.java
*/
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation{
}
package cn.cast.day2;
/*
AnnotationTest.java
*/
@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);
}
}
}
结果:
@cn.cast.day2.ItcastAnnotation()
为注解增加基本属性
注解属性:
一个注解相当与一个胸牌,如果你胸前贴了胸牌就是传智播客的学生,否则就不是。如果还想区分出是传智博客哪个班的学生,这个时候需要为胸牌再增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")
定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")
用反射方式获取注解对应的实例对象后,再通过该对象调用属性对应的方法:
MyAnnotation a=AnnotationTest.class.getAnnotation(MyAnnotation.class);
Sysyem.out.println(a.color());
为属性指定缺省值:
String color() default "yellow";
value属性:
String vlaue() default "abc"
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
为注解增加高级属性:
数组类型的属性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括
枚举类型的属性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
注解类型的属性:
MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
可以认为上面这个 @MyAnnotation 是 MyAnnotaion 类的一个实例对象,同样的道理, 可以认为上面这个 @MetaAnnotation 是 MetaAnnotation 类的一个实例对象,调用代码如下:
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
注解的详细语法可以通过看 java 语言规范了解,即看 java 的 language specification 。
备注:
枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。
在程序中如何创建出一个注解的实例对象啊?直接用@放上一个标记即可
MetaAnnotation注解的定义:
public @interface MetaAnnotation {
String value();
}
查阅java语言规范:
枚举的属性类型包括:基本数据类型,String,Class,枚举,其他注解,以及这些类型的数组