注解Annotation
Annotation(Object value)
构造一条具有给定值(可能为 null)的 annotation 记录
Object getValue()
返回属性值,可能为 null。
String toString()
返回此 Annotation 的 String 表示形式。
了解注解及几个基本注解(比枚举更为重要!Jdk1.5新特性)
一个注解实际上就是一个类
基本注解1 @SuppressWarnings 元注解:@Retention(value=SOURCE):
示例:
@SuppressWarnings("deprecation")//不要提示方法过时了
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);//过时的方法
}
基本注解2
@Deprecated//表示这个方法过时了
public static void sayhello(){
System.out.println("hi,java!");
}
基本注解3
@Override//注解这个方法是覆盖:当然也可以用于检测某个方法是否覆盖了父类的方法
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,就没有某种标记;以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无某种标记,看你有什么标记,就执行相应的动作
标记可以加在包、类、字段、方法、、方法的参数及局部变量上!
注解的定义及反射调用
注解类
@Interface A
{}
应用了注解类的类
@A
class B
{}
对应用了注解类的类进行反射操作的类
class C
{
B.class.isAnnotionPresent(A.class);
A a=B.class.getAnnotion(A.class);
}
示例:
//定义注解类
import java.lang.annotation.*;
@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);
}
}
}
元注解:给注解进行注解的注解
元注解1
@Retention
指示注释类型的注释要保留多久,如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。
三个取值(枚举类)RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME
分别对应:java源文件——class文件——内存中的字节码
思考基本注解的@Retention取值是什么(其默认值是CLASS)
@Override SOURCE
@SupressWarnings SOURCE
@Deprecated RUNTIME
元注解2
@Target
指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
注解的属性:
一个注解相当于一个胸牌,如果你有了胸牌,就是传智播客的学生,否则就不是,如果还想区分是那个班的学生,就可以给胸牌添加一个属性来区分
增加属性的标记效果为@MyAnnotation(color="red");
1、定义一个注解
public @interface ItcastAnnotation {
String color();//color是注解的属性,同时color()还是该注解的一个方法,返回值是String类型的color属性
}
2、使用注解并给属性赋值:
@ItcastAnnotation(color="red")
3、用反射的方式获取注解对应的实例对象后,在通过该对象调用属性对应的方法
@ItcastAnnotation(color="red")
public static void main(String[] args) {
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class))
{
ItcastAnnotation annotation=
(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation.color());//使用注解的方法获取其值
}
3、为属性指定缺省值
String color()default "yellow";
4、value属性
String value()default "zxx";
如果注解中有一个名称为valuee的属性,而且你只想设置value属性(即其他属性)
给数组增加复制属性
1、数组类型属性
int[]arrayArr() default{1,2,3};
@MyAnnotation(arrayArr={3,4,5})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括号
2.枚举类型的属性
EnumTest.TrafficLamp();
3、注解类型的注解属性
4、class类型的注解属性
示例:
注解的定义:
public @interface ItcastAnnotation {
String color() default "yellow";
String value();//特殊的value类型注解属性
int[] arrayArr();//数组类型的属性
EnumTest.TrafficLamp lamp()default EnumTest.TrafficLamp.GREEN;//枚举类型的属性
MetaAnnotation annotationArr()default @MetaAnnotation("meta");//注解类型的属性
}
元注解的定义(和一般的注解定义一样,但被其他注解使用时,就成了元注解)
public @interface MetaAnnotation {
String value();
}
注解的使用:
@ItcastAnnotation(color="red",value="avc",arrayArr={2},annotationArr=@MetaAnnotation("flx"))
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.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayArr().length);//数组类型的注解属性
System.out.println(annotation.lamp().nextLamp());//获取枚举类型的注解属性
System.out.println(annotation.annotationArr().value());//注解类型的注解属性
}
}
|