java元数据(metadata)ITeye - 娱乐之横扫全球

java元数据(metadata)ITeye

2019年04月04日11时24分57秒 | 作者: 鸿朗 | 标签: 数据,注解,一个 | 浏览: 1757

什么是元数据?

元数据是指用来描绘数据的数据,更浅显一点,便是描绘代码间联系,或许代码与其他资源(例如数据库表)之间内在联系的数据。在一些技能结构,如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)的注解,那么阐明该注解在程序运转期间都会存在内存傍边。此刻,咱们能够经过反射来取得界说在某个类上的一切注解。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    java元数据(metadata)ITeye

    数据,注解,一个
  • 2

    java awt Graphics 绘图ITeye

    字符串,二维码,图片
  • 3

    slf4jITeye

    日志,运用,一个
  • 4
  • 5

    spring+mybatis装备ITeye

    装备,一下,需求
  • 6

    文件的读写和操作ITeye

    文件,字节,输出
  • 7

    ubuntu下python办理ITeye

    能够,咱们,经过
  • 8

    第03章 惯例选择器 (2)ITeye

    主页,选择器,运用
  • 9

    zookeeper原理(转)ITeye

    节点,集群,一个
  • 10