黑马程序员_【总结】_ 高新_4_注解 Annotation

注解 Annotation


---------- android培训 java培训、期待与您交流! ---------- 

---------------------------------------------------------------------------------------------------------------------------------------------
注解
1、一个注解,就是一个类,相当于是一个标记,什么样的标记,干什么样的事儿。
2、常见的注解
 @SuppressWarnings 取消显示指定的编译器警告。
 @Deprecated 过时,或者通常是因为它很危险或存在更好的选择。
 @Override 一个方法声明打算重写超类中的另一个方法声明。
3、@Retention 一个注解的声明周期有3个阶段
1、Java源文件--->RetentionPolig.SOURCR   注解只保留在源文件中
2、class文件--->RetentionPolig.CLASS    注解只保留在class文件中
3、内存中的字节码--->RetentionPolig.RUNTIME  注解只保留在内存中
4、 @target  表示自定义注解应用的范围
  @Target(ElementType.METHOD)   ---  方法上
  @Target(ElementType.TYPE)     ---  类上
5、注解可标 声明在包、类、字段、方法、局部变量、方法参数等的前面
用来对这些元素进行说明,注释。它的作用非常的多
例如:进行编译检查、生成说明文档、代码分析等。
6、要实现一个自定义注解,必须通过 @interface 关键字来定义。且在 @interface 之前,
需要通过元注解来描述该注解的使用范围( @Target )、生命周期( @Retention )
6、注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。
7、注解大多是用做对某个类、方法、字段进行说明,标识的。
以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,
来决定该做些什么处理或不该进行什么处理  
8、注解的使用分为三个过程: 定义注解-->声明注解-->得到注解
(下详细)
9、注解很重要。
-------------------------------------------------------
一个注解,就是一个类  注解相当于是一个胸牌
 【注解非常重要,能感觉到其作用不仅仅源于注释,和我所学到的下面的知识,
当注解结合反射技术肯定能让我做太多的事情】
 
 @SuppressWarnings       取消显示指定的编译器警告。
 @Deprecated                     过时,或者通常是因为它很危险或存在更好的选择。
 @Override                            一个方法声明打算重写超类中的另一个方法声明。
 
 注解 相当于一个标记,加了注解就等于搭上了某种标记
没加,则等于没有某种标记,以及欧,java 编译器开发工具和其他程序可以用发射来了解
你的类及各种元素上有无任何标记,看你的 有什么标记,就去干相应的事,
 
 标记可以声明在包、类、字段、方法、局部变量、方法参数等的前面
用来对这些元素进行说明,注释。它的作用非常的多
例如:进行编译检查、生成说明文档、代码分析等。

注解可以有哪些成员
注解和接口相似,它只能定义final 静态属性和公共抽象方法。
注解的方法
1.方法前默认会加上public abstract
2.在声明方法时可以定义方法的默认返回值。
列如
	String color() default "blue";		>>
		public abstract String color() default "blue";
	String[] color() default {"blue", "red",......}		>>
		public abstract String[] color() default {"blue", "red",......}
注解的使用分为三个过程。


定义注解-->声明注解-->得到注解


a. 定义注解(参照上面的注解定义)
b. 声明注解
1. 在哪些元素上声明注解
如果定义注解时没有指定@Target 元注解来限制它的使用范围,
那么该注解可以使用在ElementType 枚举指定的任何一个元素前。
否则,只能声明在@Target 元注解指定的元素前。
一般形式:
@注解名()
2. 对注解的方法的返回值进行赋值
对于注解中定义的每一个没有默认返回值的方法,
在声明注解时必须对它的每一个方法的返回值进行赋值。
一般形式:
@注解名(方法名=方法返回值,......)
如果方法返回的是一个数组时,那么将方法返回值写在{}符号里
@注解名(方法名={返回值1,返回值2,......},......)
3. 对于只含有value 方法的注解,在声明注解时可以只写返回值。


c. 得到注解
对于生命周期为运行期间的注解,都可以通过反射获得该元素上的注解实例。
1、声明在一个类中的注解
可以通过 该类Class 对象的 getAnnotation 或getAnnotations 方法获得
2、声明在一个字段中的注解
通过 Field 对象的getAnnotation 或getAnnotations 方法获得
3、声明在一个方法中的注解
通过 Method 对象的getAnnotation 或getAnnotations 方法获得
//	注解类
	@interface A{}
// 应用了注解类 -- 的类
		 @A
		 class B{}
//对 --应用了注解类  --的类
	 	class C{
			B.class.isAnnotationPresent{
	 			A.class;
	 		}
	 		A a = B.class.getAnnotation(A.class);
	 
	 	}
【】1、 生命周期
一个注解的声明周期有3个阶段对应@Retention  元注解
1、Java源文件 -------------->RetentionPolig.SOURCR   注解只保留在源文件中
2、class文件 -------------->RetentionPolig.CLASS    注解只保留在class文件中
3、内存中的字节码   -------------->RetentionPolig.RUNTIME  注解只保留在内存中



思考:      这三个注解在什么阶段
 @SuppressWarnings 
 @Deprecated 
 @Override
 
 【】2、 类型     Type
1、class      2、interface      3、enum     4、@Interface
 他们有点像类,但又不是类,  他们是java 中的一个类型
 
 【】3、适用范围
 @target 元注解,表示自定义注解应用的范围
 @Target(ElementType.METHOD)   ---  方法上
 @Target(ElementType.TYPE)     ---  类上
 
 为注解增加属性
   设值的时候,当作方法。   赋值的时候, 当作属性,调用时 是方法
public @Interface ItcastAnnotation{
   		String color();
	}
   @ItcastAnnotation(color: "red");

public class AnnotationTest{
	public static void main(String []args){
		if(AnnotationTest.class.isAnnotationPresent(ItacaseAnnotation.class)){
			ItcastAnnotation ia = ()AnnotationTest.getA
		}
	}
} 
要实现一个自定义注解,必须通过 @interface 关键字来定义。
且在 @interface 之前,需要通过元注解来描述该注解的使用范围( @Target )、生命周期( @Retention )
【自定义注解】
【A】自定义注解类 
//
//1、通过注解设定 本注解 处于RUNTIME  运行时的阶段
@Retention(RetentionPolicy.RUNTIME)
//1-2  通过 @interface  自定义一个注解
public @interface ItcastAnnotation {
	// 为注解添加 属性
	
	//2   添加一个color    并通过 default 设定  缺省值(即默认的值)
	String color() default "blue"; 
	//3   value 比较 特殊,单独时,可以直接写值 ,不用 value=""
	String value();//
	//4  添加一个    数组类型 没有  缺省值
	int [] arrayAttr();
	//5  枚举 类型  之前 专注总结 枚举的时候,写过的一个高级枚举:
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
	//6 注解类型  注解中的注解     设定  缺省值
	MetaAnnotation annotationAttr() default @MetaAnnotation("mmmmmmmm");
	//7  添加一个 Class字节码文件
	Class className();
}
【B】 ItcastAnnotation 的测试类 
//1、使用自定义注解 @ItcastAnnotation,其中有很多属性   
@ItcastAnnotation(annotationAttr=@MetaAnnotation("aaaaa"),value = "abc",arrayAttr=2,className=String.class)
public class AnnotationTest {
	
	//2				 特殊属性(方法) value
	//@ItcastAnnotation("abc")//当注解方法只有value、或者其他都有缺省时,可以这么写
	public static void main(String[] args) throws Exception
	{ 
		// TODO Auto-generated method stub
		//3-1、过时的方法
		System.runFinalizersOnExit(true);
		//3-3、设置方法过时
		sayHelle();
		//4-1、(证明注解也是一个类)。
		//      先得到AnnotationTest字节码                           检测是否有注解               
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
			//4-2  既然注解是一个类,  创建一个对象
			ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			//System.out.println(annotation);
			//4-3 color 在应用注解的时候没有设值  所以这里会引用 缺省值
			System.out.println("color:   "+annotation.color());
			System.out.println("value:   "+annotation.value());
			
			System.out.println("arrayAttr.length:  "+annotation.arrayAttr().length);
			//4-4  把arrayAttr  进行转换 ,并打印
			List<int []> lists = Arrays.asList(annotation.arrayAttr());
			
			for(int [] list : lists){
				for(int li : list){
					System.out.print(li+"   >");
				}
			}
			 //4-5  枚举 类型  之前 专注总结 枚举的时候,写过的一个高级枚举
			System.out.println("\nEnumTest.TrafficLamp:  "+annotation.lamp().nextLamp().name());
			
			//4-6   注解中的  注解
			System.out.println("annotationAttr.value:   "+annotation.annotationAttr().value());
		}
	}
	//3-2、设置方法过时
	@Deprecated
	public static void sayHelle(){
		System.out.println("唉,哥辉煌的时代已然过去鸟。");
	}
注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。

注解大多是用做对某个类、方法、字段进行说明,标识的。
以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,
来决定该做些什么处理或不该进行什么处理  





---------------------------------------------------------------------------------------------------------------------------------------------
---------- android培训、 java培训、期待与您交流!----------


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值