java中元数据是什么_java 元数据

什么是元数据?

元数据是指用来描述数据的数据,更通俗一点,就是描述代码间关系,或者代码与其他资源(例如数据库表)之间内在联系的数据。在一些技术框架,如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就是通过注解来表示元数据的。

一个简单的注解定义:

48304ba5e6f9fe08f3fa1abda7d326ab.png

public @interface MyAnnotation {

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

int age = 25;

// 定义公共的抽象方法

String name();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

反编译字节码文件得到:

37ba8b77906a2d3c503921f52cc6dd94.png

由上我们可以得到,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)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值