什么是元数据?

元数据是指用来描述数据的数据,更通俗一点,就是描述代码间关系,或者代码与其他资源(例如数据库表)之间内在联系的数据。在一些技术框架,如struts、EJB、hibernate就不知不觉用到了元数据。对struts来说,元数据指的是struts-config.xml;对EJB来说,就是ejb-jar.xml和厂商自定义的xml文件;对hibernate来说就是hbm文件。以上阐述的几种元数据都是基于xml文件的或者其他形式的单独配置文件。这样表示有些不便之处。一、与被描述的文件分离,不利于一致性的维护;第二、所有这样文件都是ASCII文件,没有显式的类型支持。基于元数据的广泛应用,JDK5.0引入了Annotation的概念来描述元数据。在java中,元数据以标签的形式存在于java代码中,元数据标签的存在并不影响程序代码的编译和执行。

如何创建元数据?

JDK5.0出来后,java语言中就有了四种类型(TYPE),即类(class)、枚举(enum)、接口(interface)和注解(@interface),它们是处在同一级别的。java就是通过注解来表示元数据的。

一个简单的注解定义:

public @interface MyAnnotation {

// 定义公共的final静态属性

int age = 25;

// 定义公共的抽象方法

String name();

}

反编译字节码文件得到:

由上我们可以得到,java的注解本质上是一个接口,而且是继承了接口Annotation的接口。既然是接口,那么

a.注解可以有成员

注解和接口相似,它只能定义final静态属性和公共抽象方法。

b.注解的方法

1.方法前默认会加上public abstract且只能由这两个修饰符修饰。属性前默认加上public static final 且只能由这些修饰符修饰。由于是final,定义时必须初始化。

2.在声明方法时可以定义方法的默认返回值。

例如:

String color() default "blue";

String[] color() default {"blue","red",......}

3.方法的返回值可以有哪些类型

8种基本类型,String、Class、枚举、注解及这些类型的数组。

4.java.lang.annotation.Annotation 本身是接口,而不是注解,当使用关键字@interface 定义一个注解时,该注解隐含的继承了java.lang.annotation.Annotation接口;如果我们定义一个接口,并且让该接口继承自Annotation,那么我们定义的接口依然是接口而不是注解。综上,定义注解只能依靠@interface实现。

JDK提供的几个基本注解

a. @SuppressWarnings

该注解的作用是阻止编译器发出某些警告信息。

它可以有以下参数:

deprecation :过时的类或方法警告。

unchecked:执行了未检查的转换时警告。

fallthrough:当Switch程序块直接通往下一种情况而没有Break时的警告。

path:在类路径、源文件路径等中有不存在的路径时的警告。

serial:当在可序列化的类上缺少serialVersionUID定义时的警告。

finally:任何finally子句不能完成时的警告。

all:关于以上所有情况的警告。

b.@Deprecated

该注解的作用是标记某个过时的类或方法。

c. @Override

该注解用在方法前面,用来标识该方法是重写父类的某个方法。

元注解(注解的注解)

a. @Retention

它是被定义在一个注解类的前面,用来说明该注解的生命周期。

它有以下参数:

RetentionPolicy.SOURCE:指定注解只保留在源文件当中。

RetentionPolicy.CLASS:指定注解只保留在class文件中。(缺省)

RetentionPolicy.RUNTIME:指定注解可以保留在程序运行期间。

b. @Target

它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前。(默认可以放在任何元素之前)

它有以下参数:

ElementType.TYPE:说明该注解只能被声明在一个类、接口、枚举前。

ElementType.FIELD:说明该注解只能被声明在一个类的字段前。

ElementType.METHOD:说明该注解只能被声明在一个类的方法前。

ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。

ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。

ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。

ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。

ElementType.PACKAGE:说明该注解只能声明在一个包名前。

c. @Inherited 表明该注解将会被子类继承。

需要说明的是,加上该元注解的注解,只有用在类元素上才有效果。这是在JDK总的原话:

Note that this meta-annotation type has no effect if the annotated

type is used to annotate anything other than a class. Note also

that this meta-annotation only causes annotations to be inherited

from superclasses; annotations on implemented interfaces have no

effect

但是在其他元素上的注解,只要你没有覆盖父类中的元素,是会继承过来的。这就是为什么有getDeclaredAnnotations()和getAnnotations()的原因。

d. @Documented

表明在生成JavaDoc文档时,该注解也会出现在javaDoc文档中。

注解的生命周期

一个注解可以有三个生命周期,它默认的生命周期是保留在一个CLASS文件,

但它也可以由一个@Retetion的元注解指定它的生命周期。

a.java源文件

当在一个注解类前定义了一个@Retetion(RetentionPolicy.SOURCE)的注解,那么说明该注解只保留在一个源文件当中,当编译器将源文件编译成class文件时,它不会将源文件中定义的注解保留在class文件中。

b. class文件中

当在一个注解类前定义了一个@Retetion(RetentionPolicy.CLASS)的注解,那么说明该注解只保留在一个class文件当中,当加载class文件到内存时,虚拟机会将注解去掉,从而在程序中不能访问。

c. 程序运行期间

当在一个注解类前定义了一个@Retetion(RetentionPolicy.RUNTIME)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解。

java中元数据是什么_java 元数据相关推荐

  1. java中的垃圾收集器_Java中的垃圾收集

    java中的垃圾收集器 Garbage collection in java is one of the advance topic. Java GC knowledge helps us in fi ...

  2. java中注解的使用_java中注解的使用

    使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节.注解就是用于修饰类.全局变量.方法.参数或局部变量的接口,java中规定,注解的使用 ...

  3. java中组件与容器_java中的容器组件和非容器组件

    1.java使用到的图形类主要在java.awt 与javax.swing包中. 2.java.awt 与 javax.swing包的区别: ① java.awt中使用的图形类都是依赖于系统的图形库的 ...

  4. java中事件监听_Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...

  5. java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:

    1.简要介绍java程序的健壮性. 答:JAVA程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对于类型的检查很严格,而且它的垃圾回收机制也有效的避免了内存的泄漏. 2.为什 ...

  6. java中飞飞检查异常_Java复习6异常处理

    Java复习6.异常处理 20131005 前言: Java中的异常处理机制是非常强大的,相比C++ 来说,更加系统.但是我们开发人员没有很好的使用这一点.一些小的程序是没有什么问题的,但是对于大型项 ...

  7. java中标签怎么用_Java中标签的使用

    很多程序设计语言中有goto语句,goto语句的使用,使的程序变得难以读懂,尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用:Java没有goto.然而,在break和continue ...

  8. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  9. java中的string函数_java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; Str ...

  10. 请选择JAVA中有效的标识_Java中有效的标识符是什么?

    Java中的有效标识符–必须以字母(A到Z或a到z),货币字符($)或下划线(_)开头. 在第一个字符之后可以有任何字符组合. 不能是关键字. 示例 以下示例显示了用于在Java中声明变量的各种可能的 ...

最新文章

  1. 《因果学习周刊》第9期:因果学习中的工具变量
  2. 【opencv_python学习之二.五】如何查看opencv_python的函数说明
  3. 终止线程的2种方法。标记法和中断
  4. 题注Oracle数据库的网络连接原理
  5. SVM支持向量机【直观理解】
  6. adb不识别设备(手机)的若干情形及解决方法
  7. PAT_1007(中文)_素数对猜想
  8. 从Ubuntu12.04LTS到Foreda19再到Foreda8
  9. 阿里云图数据库GDB V3引擎发布,加速开启“图智”未来
  10. 程序员必须知道的15件事(转)
  11. 一文学会Python标准库struct序列化与反序列化
  12. 8年测试工程师,从“点点点”成长到华为测试主管——我必须告诉你这些......(共勉)
  13. Bailian2812 恼人的青蛙 POJ1054 The Troublesome Frog【暴力】
  14. spark 安装详细步骤
  15. 基于物联网的智能门锁应用系统架构设计及项目开发实践总结
  16. 计算机掌握录音机的使用方法,如何使用2种方法从计算机录制音频
  17. Invalid bound statement (not found)出现的原因和解决方法
  18. Android默认时区大全
  19. 阿里云 ECS 7 天实践训练营 - day01 -基于ECS搭建FTP服务
  20. Libgdx之国际化 中英文菜单切换

热门文章

  1. 数据挖掘概念与技术第三版 范明、孟晓峰译 第三章习题答案
  2. 苹果助手一键安装_再见!国内经典的iOS越狱助手,正式宣布下线
  3. linux 黑苹果 win7双系统,学习笔记:安装黑苹果和win双系统(基础篇)
  4. Linux 操作系统原理介绍
  5. 负债均衡(三)下载安装Nginx
  6. js 中 clientHeight、scrollHeight 等获取的高度的区别和使用
  7. Hadoop The Definitive Guide:Hadoop权威指南-PART 1
  8. 项目立项,项目经理需要做什么
  9. 用“压缩映射”原理证明数列收敛
  10. 力软敏捷开发框架源码7.0.6解析