您的位置:首页 > 职场人生

【黑马程序员】java基础加强-------注解(annotation)

2013-12-03 22:23 501 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------

一、注解的定义
定义: 注解(Annotation)是一种标记性的接口,注解是Java的一个新的类型(与接口很相似),它与类(Class)、接口(interface)、枚举(enum)是在同一个层次,注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。我们可以定义注解、声明注解、获得注解,并且根据获得的注解做相应的处理,许多框架都大量应用了注解。
二、简单的注解
1、@supperessWarnings("deprecation") //告诉编译器该方法我已经知道已经过时了
2、@Deprecated //此注解注明该方法过时,提示程序员该方法过时
3、@Overide //表示该方法是覆盖父类的方法
这种标记可以应用在:包上、类上、字段上、方法上、方法参数上、局部变量上面
三、注解类的应用结构图



自己定义一个注解;

//自定义一个注解类。
public @interface itcastAnnotation {
String color() default "yellow";
String value();
}


//这一个是一个应用”注解类“的类
import java.lang.annotation.Annotation;
@itcastAnnotation
public class AnnotationTest {
public static void main(String[] args)
{

}
}
四、为注解增加各种属性

1、什么是注解的属性?
理解:一个注解相当于一个胸牌,如果你胸前有胸牌,就是传智播客的学生,否则就不是。
如果还想区分是传智播客哪个班的学生,这时可以在胸牌上增加一个属性加以区分。

例:@MyAnnotation(color="red")
2、定义基本类型的属性:
//自定义一个注解类。
public @interface itcastAnnotation {
//增加属性,可以有可以没有默认值
String color() default "yellow";
String value();
}
在应用中,可以为注解类中的属性设置属性值

//这一个是一个注解类,可以在小括号内设置属性值
@itcastAnnotation(annotation=@MetaAnnotation("物联云"),color="red",value="hcs",arrayAttr={60,80,90})


3、用反射的方式获取注解的实例对象后,在通过该对象调用属性对应的方法

例:
@itcastAnnotation(annotation=@MetaAnnotation("物联云"),color="red",value="hcs",arrayAttr={60,80,90})

public class AnnotationTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(itcastAnnotation.class))
{
//通过反射获取注解对象
itcastAnnotation annotation=(itcastAnnotation)AnnotationTest.class.getAnnotation(itcastAnnotation.class);
//也可以认为上面的@MyAnnotation是MyAnnotation类的实例对象
System.out.println("打印注解:"+annotation);
4、可以为注解类中的属性指定默认值

例:string color() difaule"yellow";
5、value属性,如果注解中有一个value的属性,且只想设置value属性(其他属性都采用默认值)
例:string vaule();

应用中:可以省略value=      比如:@itcastAnnotation("lili")


6、数组类型的属性
注意:如果数组类型的属性中只有一个元素,这时属性值部分可以省略大括号

public @interface itcastAnnotation {
int [] array1() default{2,4,5}
int[] array2() default{2}
}

//这一个是一个应用”注解类“的类
import java.lang.annotation.Annotation;
@itcastAnnotation(array1={3,4,5},array=8)//设置属性值
public class AnnotationTest {
public static void main(String[] args)
{}
}
7、枚举类型的实现:

注解类中属性:EnumTest.TrafficLamp  lamp();
在应用中:@MyAnnotation(lampEnumTest.TrafficLamp.GREEN)


五、注解的存在的3个阶段

@Retention(Retrntionpolicy.RUNTIME) 表示将注解保留到内存中的字节码阶段
@Retention(Retrntionpolicy.CLASS) 表示将注解保留到编译阶段

@Retention(Retrntionpolicy.SOUTCE) 表示将注解保留到java源文件阶段

Target元注解,默认值为任何元素:
. @Target(ElementType.[type])

[type]={METHOD, FIELD, TYPE(类、接口、枚举声明), CONSTRUCTOR, LOCAL_VARIABLE,PARAMETER}

代码练习:

package cn.itcast.day2;

import java.lang.annotation.Annotation;
//这一个是一个注解类,可以在小括号内设置属性值 @itcastAnnotation(annotation=@MetaAnnotation("物联云"),color="red",value="hcs",arrayAttr={60,80,90})

public class AnnotationTest {

/**
* @param args
*/
//表示类中的过时方法我已经知道
@SuppressWarnings("Deprecation")

public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(itcastAnnotation.class))
{
//通过反射获取注解对象
itcastAnnotation annotation=(itcastAnnotation)AnnotationTest.class.getAnnotation(itcastAnnotation.class);

System.out.println("打印注解:"+annotation);
System.out.println("以下是annotation注解的属性值:");
System.out.println(annotation.color());

System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());

//注解属性=注解,的属性值调用
System.out.println(annotation.annotation().value());
}

}
@Deprecated//此注解表示,以下方法已经过时
public static void sayHolle(){
System.out.println("你好,黑马");
}
}
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;

//@Target(ElementType.METHOD)//表示将注解类保留到方法上

@Target({ElementType.METHOD,ElementType.TYPE})//表示带注解类可以应用在调用者类中的方法上

@Retention(RetentionPolicy.RUNTIME)//注解上还有注解:称为:元注解;表示将注解类保留到:内存中的字节码阶段

//自定义一个注解类。
public @interface itcastAnnotation {
String color() default "yellow";
String value();
int[] arrayAttr() default {1,2,3};//注解的属性是数组类型

EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//注解的属性是枚举类型

//注解的属性对应一个注解
MetaAnnotation annotation() default @MetaAnnotation("黑马云");//注解的属性是一个注解
}


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: