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

---------------------- <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>、期待与您交流! ----------------------


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值