Annotation

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

import javax.lang.model.element.Element;

public class Annotationj {
	/**2017-02-22 21:13
	 *  元数据MetaData的支持
	 *  Annotation 注解
	 *  这些标记可以在编译、类加载、运行时被读取,并执行相应的处理
	 *  通过使用注解可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息
	 *  代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署
	 *  Annotation 提供了一种为程序元素设置元数据的方法
	 *  Annotation 就像修饰符一样
	 *  可修饰包、类、构造器、方法、成员变量、参数、局部变量的声明
	 *  这些信息都被存储在Annotation的  name=value
	 *  
	 *  
	 *  Annotation是一个接口,程序可以通过反射来获取指定程序元素的Annotation对象
	 *  然后通过Annottion 对象来取得注解里的元数据
	 *  
	 *  Annotation 能被用来为程序元素设置元数据
	 *  Annotation 不影响程序程序代码的执行
	 *  要想Annotation 在运行时起一定的作用
	 *  只有通过某种配套的工具对Annotation中的信息进行访问和处理
	 *  访问和处理Annotation的工具统称APT   Annotation Processing Tool
	 *  
	 *  
	 *  @ 修饰符
	 *  
	 *  5个基本Aoontation
	 *  @Override 
	 *  指定方法覆载  强制一个子类必须覆盖父类的方法
	 *  作用就是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否则就会编译错误
	 *  只能修饰方法
	 *  @Deprecated
	 *  表示某个程序元素已经过时,其他程序使用已过时的类、方法时,编译器将会给出警告
	 *  @SuppressWarnings
	 *  取消该类某个编译器警告,同时修饰该类里的某个方法取消显示另一个编译器警告,那么该方法将会同时取消显示这两个编译器警告
	 *  通常没有泛型限制的集合会引起编译器警告
	 *  @SafeVarargs   抑制警告
	 *  堆污染警告
	 *  泛型擦除时引发unchecked
	 *  引发这种错误原因称为 堆污染  Heap pollution
	 *  当把一个 不带泛型的对象赋给一个带泛型的变量时,就会发生这种堆污染
	 *  @FunctionInterface
	 *  接口中只有一个抽象方法,该接口就是函数式接口
	 *  用来指定某个接口必须是函数式接口
	 *  
	 */
	
	/**2017-02-22 21:42
	 * annotation 包下提供6个meta annotation 元 Annotation 
	 * 五个元annotation 都用于修饰其他的Anntation定义
	 *  @retention  
	 *  只能用于修饰Annotation定义
	 *  指定被修饰的Annotation能保留多长时间
	 *  
	 * @Target 
	 * 只能修饰一个Annotation定义
	 * 指定被修饰的Annotation能用于修饰那些程序单元
		//	@Target(ElementType.CONSTRUCTOR)  修饰构造器
	 * 
	 * @Documented
	 * 指定被修饰的 将被javadoc提取成文档
	 * 
	 * @inherited 
	 * 被修饰的 annotation将具有继承性
	 * 其子类将被自动被  @ 修饰
	 * 
	 */
	
	
	/**2017-02-22 21:58
	 * 自定义的注解接口 继承了Annotation 接口
	 * 可以通过反射看到MyTag接口包含了Annotation里的方法  
	 * 
	 * 
	 * 是否可以包含成员变量,分为两类
	 * 标记Annotation 
	 * 没有定义成员变量的Annotation 类型被称为标记
	 * 这种Annotation仅利用自身的存在与否来提供信息		
	 * 
	 * 元数据Annotation 
	 * 包含成员变量的Annotation 因为他们可以接受更多的元数据
	 * 也被称为元数据Annotation
	 * 
	 */
	
	
	/**2017-02-22 22:01
	 * 提取Annotation信息
	 * 使用Annotation修饰了的类、方法、成员变量等成员之后
	 * 这些Annotation不会自己生效,必须由开发者提供相应的工具来提取并处理Annotation信息
	 * 
	 * java使用Annotation接口来代表程序元素前面的注解,该接口是所有注解的父接口
	 * java.lang.reflect包
	 * AnnotationElement接口主要有以下实现类
	 * 		-----Class
	 * 		-----Constructor  构造器
	 * 		-----Field成员变量
	 * 		-----Method
	 * 		-----Package
	 * 
	 * 该包下只要包含一些实现反射功能的工具类
	 * 只有当定义Annotation时使用了@Retention(RetentionPolicy.RUNTIME)修饰时
	 * 该Annotation才会在运行时可见
	 * jvm才会在装在class文件时读取并保存在class文件中的Annotation
	 * 
	 * AnnotationElement接口时所有程序元素的父接口
	 * 程序可以通过反射获取某个类的AnnotationElement对象之后
	 * 程序就可以调用该对象的方法来访问Annotation信息
	 * 
	 */
	/**2017-02-22 22:14
	 * 重复注解
	 * java 8 允许使用多个相同类型的Annotation 来修饰同一个类 
	 * 重复注解只是一个简化写法,这种简化写法是一种假象
	 * 多个重复注解其实会被作为 容器注解  的value成员变量的数组元素
	 */
	/**2017-02-22 22:18
	 * 
	 * ElementType枚举 增加了  TYPE_PARAMETER   TYPE_USE  
	 * 允许定义枚举时使用@Target(ElementType.TYPE_USE)修饰
	 * 这种注解被称为Type Annotation  类型注解
	 * 
	 *  Type Annotation 可以在任何用到类型的地方使用
	 *  创建对象 new
	 *  类型转换
	 *  使用implements实现接口
	 *  使用throws声明异常
	 */
	
	/**2017-02-22 22:24
	 * 编译时 处理 Annotation
	 * APT  Annotation Processing Tool 是一种注解工具
	 * 对源代码文件进行检测
	 * 找出源文件所包含的Annotation 信息
	 * 针对Annotation信息 进行额外的处理
	 * 
	 *   javac.exe -processor  选项可以指定一个Annotation处理器
	 *   每个处理器都需要实现
	 */
	@Testannotation   // 使用自己定义的 注解
	(age = 0, name = "")
	public static void main(String[] args) {
		
	}
	
	//定义一个简单的TYPE  不带任何成员变量
	@Target(ElementType.TYPE_USE)
	@interface NotNull{}
	
	
	
	public @interface Testannotation{
		String name();
		int age();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值