当前位置: 首页 > news >正文

Java 注解

  Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。

    Annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息。需要注意的是,这里存在着一个基本的规则:Annotation不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行。另外,尽管一些annotation通过java的反射api方法在运行时被访问,而java语言解释器在工作时忽略了这些annotation。正是由于java虚拟机忽略了Annotation,导致了annotation类型在代码中是“不起作用”的; 只有通过某种配套的工具才会对annotation类型中的信息进行访问和处理。

三种内置的注解,在java.lang包中:

  • @Override
  • @Deprecated     表示修饰的内容已经过时了,不建议使用这个方法了。
  • @SupressWarnings 关闭不当的编译器警告信息

SupressWarnings 的参数是一个String数组,可以的取值有

           1.deprecation:使用了不赞成使用的类或方法时的警告;
    2.unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 
    3.fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
    4.path:在类路径、源文件路径等中有不存在的路径时的警告; 
    5.serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告; 
    6.finally:任何 finally 子句不能正常完成时的警告; 
    7.all:关于以上所有情况的警告

public @interface _Test {
}

在注解中可以包含一些元素,注解跟接口很相似,但是注解的元素可以指定默认值,没有元素的注解成为标记注解
注解可以定义到任意的位置上,使用的位置可以由@Target指定。

元注解

@Target 表示注解可以用于什么地方 在ElementType中

  • CONSTRUCTOR
  • FIELD
  • LOCAL_VARIABLE
  • METHOD
  • PACKAGE
  • PARAMETER
  • TYPE    类、接口、enum、注解的声明

@Retention 表示在什么级别保存注解信息,在RetentionPolicy中

  • SOURCE
  • CLASS
  • RUNTIME

@Documented 将此注解包含在javadoc中

@Inherited 允许子类继承父类的注解,是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

 

注解中的元素只能是一下类型,默认值必须是确定的,不能是null:

  • 基本类型
  • String
  • Class
  • enum
  • Annatation,,也就是注解可以嵌套

注解的一个价值在于,对于RUNTIME的注解,可以通过反射机制来获得注解的信息对应的相关的值,完成相关操作

 

注解的赋值:

当元素的名字是value的时候,如果只想对这一个元素赋值,可以直接写,不用key=val的对儿

对于数组,使用{}赋值,多个参数使用逗号隔开,并且要使用 key=val的语法

 

关于反射读取注解:

 AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下   四个个方法来访问Annotation信息:

  方法1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
  方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
  方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
  方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。

程序举例:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface classIfo{
    String value() default "";
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface NameType{
    String value() default "这是乳名";
}
@Retention(RetentionPolicy.RUNTIME)
@interface adultIfo{
    String name() default "";
    int age() default 0;
}

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @
interface parentIfo{ int Marriage_time() default -1;
//这里是注解的嵌套,其实用起来跟一般的类型一样,使用的时候就把注解当成是接口就可以了 adultIfo [] parent()
default {}; } @classIfo("学生类-用来测试反射机制读取Annotation") class Student{
//不指定参数就是使用默认值 @NameType String name
="小明";
//这里注意数组和嵌套的使用 @parentIfo(Marriage_time
=20,parent={@adultIfo(name="baba",age=39),@adultIfo(name="mama",age=39)}) String getParent(){ return "parent"; } } public class Demo04 { public static void main(String[] args){ Class<?> cc=Student.class; Field[] ff=cc.getDeclaredFields(); for(Field f:ff){ if(f.isAnnotationPresent(NameType.class)){ NameType nt=f.getAnnotation(NameType.class); System.out.println("名字类型的说明 "+nt.value()); } } Method[] mm=cc.getDeclaredMethods(); for(Method m:mm){ if(m.isAnnotationPresent(parentIfo.class)){ parentIfo pi=m.getAnnotation(parentIfo.class); System.out.println("结婚时间:"+String.valueOf(pi.Marriage_time())); adultIfo ai[]=pi.parent(); System.out.println("父亲"+ai[0].name()+" "+ai[0].age()); System.out.println("母亲"+ai[1].name()+" "+ai[1].age()); } } } }

 

转载于:https://www.cnblogs.com/Coder-Pig/p/6670933.html

相关文章:

  • flex tree 默认展开
  • 各种流输入函数,你能安全使用么?【From My Baidu Space】
  • FluorineFx 页面无法显示services目录内容问题
  • 相册图片头尾相接的滚动算法
  • 关联查询之速度优化
  • python打造12306余票实时监控
  • as3 socket连接方法类
  • Func和Action委托简单用法
  • APMServ错误解决办法:1、Apache启动失败,请检查相关配置
  • iptables配置详解
  • wordpress如何安装主题?
  • Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace 解决方法...
  • flex不能生成swf和html
  • java中各种date格式的转化
  • eclipse+maven搭建web工程之创建
  • [译] 怎样写一个基础的编译器
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • HomeBrew常规使用教程
  • Netty源码解析1-Buffer
  • OSS Web直传 (文件图片)
  • Spark学习笔记之相关记录
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • - 概述 - 《设计模式(极简c++版)》
  • 简单易用的leetcode开发测试工具(npm)
  • 离散点最小(凸)包围边界查找
  • 深入浏览器事件循环的本质
  • 微信小程序设置上一页数据
  • 如何用纯 CSS 创作一个货车 loader
  • ​secrets --- 生成管理密码的安全随机数​
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)Nginx简介和安装教程
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (七)c52学习之旅-中断
  • (十)T检验-第一部分
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET成年了,然后呢?
  • .NET企业级应用架构设计系列之结尾篇
  • .NET性能优化(文摘)
  • :“Failed to access IIS metabase”解决方法
  • @Resource和@Autowired的区别
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • []FET-430SIM508 研究日志 11.3.31
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体