Annotation元数据(一)

一、Annotation究竟是什么?

是java5.0中的新特征

数据的数据(元数据)

Annotation和访问修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。

信息以“name=value”方式保存

annotation类型是一种接口,通过java反射方式进行访问。

二、Annotation涉及的概念?

annotation:

是java5.0中新增的语法,它的行为十分类似public、final这样的修饰符

annotation类型 :

annotation类型定义了annotation的名字、类型、成员默认值。

一个annotation类型是一个特殊的java接口,

annotation成员(是一个特殊的方法):

annotation的成员在annotation类型中以无参数的方法的形式被声明。

可以有默认值(使用default关键字)

marker annotation类型:

没有任何成员。

三、Java5.0中的标准Annotation

Override:

java.lang.Override是一个marker annotation类型,它被用作标注方法。

作用:说明了被标注的方法重载了父类的方法

使用场合:这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时发挥威力。

Deprecated:

是一个marker annotation

作用: 用于标记已过期或不赞成使用的元素(如方法)

SuppressWarnings:

@SuppressWarnings被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告。

serial

@SuppressWarnings("deprecation")

@SuppressWarnings(" unchecked ")

@Target 修饰的目标,是类、方法、字段

@Retention 保留时间,编译、运行

四、自定义Annotation语法

Public @interface 名称{

Public 类型  成员1() [default 默认值];

Public 类型  成员2() [default 默认值];

Public 类型  成员3() [default 默认值];

}

返回类型

可以是基本数据类型,数组和字符串

不可以是日期类型

自定义Annotation语法

/**

* 表示Column是实现了java.lang.annotation.Annotation接口的一个类

* 注释类与接口的区别

* 1) interface @interface

* 2)  注释的方法可带默认值

* 3) 指定Retention 在程序运行时仍然存在

* 4)  指定Target 主要修饰方法

*/

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface Column

{

public String name();  //返回数据库表的字段名

public int len() default 20;   //返回字段长度

public boolean unique(); //是否可空

}

例子1:自定义一个最简单的Annotation——IfInvoke

package com.aptech.servlet;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

public @interface IfInvoke {

public boolean invoke();

}

注意:

@Retention(RetentionPolicy.RUNTIME):表示在运行时元数据还能被访问

@interface:相当于实现了Annotation接口

Invoke:不需要实现的方法,并且返回类型有比较大的限制

例子2:自定义一个最简单的Annotation——Employee(1)

Employee类的基本结构

package com.aptech.servlet;

import (导入略)

public class Employee {

@IfInvoke(invoke = true)

public void extraSalary(){

System.out.println("雇员是业务员,业务提成是:3000元");

}

}注意:

@IfInvoke(invoke = true):相当于invoke方法的返回值为true

调用代码:

Employee emp = new Employee();

try {

Method m = emp.getClass().getMethod("extraSalary", new Class[]{});

Annotation[] as = m.getAnnotations();

for(Annotation a : as){

if(a instanceof IfInvoke){

IfInvoke ii = (IfInvoke)a;

boolean b = ii.invoke();

if(b){

m.invoke(emp, new Object[]{});

}else{

System.out.println("不是业务员,不被调用");

}

}

}

} catch (Exception e1) {

e1.printStackTrace();

}

五、Annotation类型的annotation

Annotation类型可以被它们自己所标注。

Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明。

这些类型和它们所支持的类在java.lang.annotation包中可以找到,主要有以下几个:

Target

Retention

Documented

六、Target类型

Target

描述了annotation所修饰的程序成员的类型 。

Target类型有唯一的value作为成员。这个成员的类型是ElementType[]类型的,ElementType类型是可以被标注的程序成员的枚举类型。

ElementType类型定义如下:

public enum ElementType {

TYPE,    // Class, interface, or enum (but not annotation)

FIELD,  // Field (including enumerated values)

METHOD,    // Method (does not include constructors)

PARAMETER,    // Method parameter

CONSTRUCTOR,// Constructor

LOCAL_VARIABLE,// Local variable or catch clause

ANNOTATION_TYPE,// Annotation Types (meta-annotations)

PACKAGE   // Java package

}

七、Retention 类型

Retention描述了annotation是否被编译器丢弃或者保留在class文件中。

通常有几种不同的选项:

将注释保留在编译后的类文件中,并在第一次加载类时读取它。

将注释保留在编译后的类文件中,但是在运行时忽略它。

按照规定使用注释,但是并不将它保留到编译后的类文件中。

这三种选项用 java.lang.annotation.RetentionPolicy 枚举表示 。

public enum RetentionPolicy {

SOURCE,// Annotation is discarded by the compiler

CLASS,// Annotation is stored in the class file, but ignored by the VM

RUNTIME// Annotation is stored in the class file and read by the VM

}

默认情况下,annotation被保存在class文件中,但在运行时并不能被反射访问。 ( RetentionPolicy. CLASS )

八、Documented类型

Documented 是一个标记注释 。

Documented 表示注释应该出现在类的Javadoc 中。

例如

在IfInvoke注释类型中,按如下定义:

@Retention(RetentionPolicy.RUNTIME)

public @interface IfInvoke {

public boolean invoke();

}

Employee类的extraSalary()方法生成的注释如下:

public void extraSalary() [和普通没什么两样]

如果改成如下的定义方式:

@Documented

@Retention(RetentionPolicy.RUNTIME) //表示在运行时元数据还能被访问

public @interface IfInvoke {

public boolean invoke();

}

Employee类的extraSalary()方法生成的注释如下:

@IfInvoke(invoke=true)

public void extraSalary()

也就是说,javadoc工具会将Annotation抽取出并添加到HTML文件中

一个稍微复杂的示例

有一个注释类型如下:

public @interface ComplexAnnotation {

public enum Sex{男, 女};

public String[] love();//爱好

public Sex sex() default Sex.女;//性别

public String name();//姓名

public int age();//年龄

}

问题:

请将该注释类型补充完整。

将该注释类型注释某一个类,赋值后将值读取出来并打印在Console,参考结果如下:

李赞红

25

游泳  爬山

import java.lang.annotation.Annotation;

@AnnotationDmo(Loves ={"爬山","游泳"} ,

sex= AnnotationDmo.Sex.男,

age = 25,name="李赞红")

public class App {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Class cl=App.class;

AnnotationDmo[] ann=(AnnotationDmo[])cl.getAnnotations();

for(AnnotationDmo a:ann){

if(a instanceof AnnotationDmo){

AnnotationDmo an =(AnnotationDmo)a;

System.out.println(an.name());

System.out.println(an.age());

System.out.println(an.sex());

System.out.println(an.sex());String Loves= "";

for(String s : an.Loves()){

Loves += s + "  ";

}

System.out.println(Loves);

}

}

}

}

思考:

注释类型中的成员可以有返回值,通过default关键字定义。

成员返回值类型不可以为java.util.Date或包装类等类型,可以是String或基本数据类型。

成员返回值类型可以是枚举类型。注意枚举类型的定义方法和访问方法。

访问方法:ComplexAnnotation.Sex.男

java - Annotation元数据的更多相关文章

  1. Java Annotation 注解

    java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...

  2. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  3. Java Annotation原理分析(一)

    转自:http://blog.csdn.net/blueheart20/article/details/18725801 小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各 ...

  4. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  5. Java Annotation 机制源码分析与使用

    1 Annotation 1.1 Annotation 概念及作用      1.  概念 An annotation is a form of metadata, that can be added ...

  6. Java Annotation手册

    Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...

  7. Java Annotation 必须掌握的特性

    什么是Annotation? Annotation翻译为中文即为注解,意思就是提供除了程序本身逻辑外的额外的数据信息.Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互 ...

  8. Java Annotation详解 理解和使用Annotation

    系统中用到了java注解: 查了一下如何使用注解,到底注解是什么: (1)创建方法:MsgTrace Java Class==> 在Create New Class中: name:输入MsgTr ...

  9. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

随机推荐

  1. 面向对象分析方法(II)

    什么是真正的对象? 什么是面向对象分析阶段时的对象? 什么是面向对象设计阶段时的对象? 什么是面向对象实现阶段时的对象? 真正的对象 我所理解的真正的对象就是现实生活中客观存在或不存在的真正的对象.这 ...

  2. JQuery 方法简写

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. Java学习-016-CSV 文件读取实例源代码

    上文(CSV文件写入)讲述了日常自动化测试过程中将测试数据写入 CSV 文件的源码,此文主要讲述如何从 CSV 文件获取测试过程中所需的参数化数据.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感 ...

  4. 【转】如何使用Android Studio把自己的Android library分发到jCenter和Maven Central

    转自:http://www.devtf.cn/?p=760&utm_source=tuicool 如何使用Android Studio把自己的Android library分发到jCenter ...

  5. .NET(c#)new关键字的三种用法

    前几天去家公司面试,有一道这样的题:写出c#中new关键字的三种用法,思前想后挖空心思也只想出了两种用法,回来查了下msdn,还真是有第三种用法:用于在泛型声明中约束可能用作类型参数的参数的类型,这是 ...

  6. js 传参报错 参数含有数字、字母组合的字符串SyntaxError: identifier starts immediately after numeric literal

    报错的意思是标识符以数字开头,这是因为js是弱类型的语言当发现第一个数字是就自动转化为数字类型的但是其中还含有字符所以报了错,‘ 报错的原因是因为我们想传的字符串,但是js却当成数字,所以需要给传的参 ...

  7. iOS:项目中用到的Cookie

    1.介绍: 做了这么长时间开发,Cookie真是用的不多,可是现在不一样了,这次的项目我用到了Cookie.其实,Cookie的使用在项目中愈加的频繁,一般情况下,提供的接口是用Cookie来识别用户 ...

  8. 解决:Detected memory leaks

    最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks!Dumping objects ->{171} normal block at 0x05785AD0, ...

  9. RequireJS初探

    什么是RequireJS? /* --- RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino ...

  10. Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象

    /*@Resource private Observer<TaxiObserverVo> taxiPushObserver; @Resource private Observer<T ...