java - Annotation元数据
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元数据的更多相关文章
- Java Annotation 注解
java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- Java Annotation原理分析(一)
转自:http://blog.csdn.net/blueheart20/article/details/18725801 小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各 ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- Java Annotation 机制源码分析与使用
1 Annotation 1.1 Annotation 概念及作用 1. 概念 An annotation is a form of metadata, that can be added ...
- Java Annotation手册
Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...
- Java Annotation 必须掌握的特性
什么是Annotation? Annotation翻译为中文即为注解,意思就是提供除了程序本身逻辑外的额外的数据信息.Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互 ...
- Java Annotation详解 理解和使用Annotation
系统中用到了java注解: 查了一下如何使用注解,到底注解是什么: (1)创建方法:MsgTrace Java Class==> 在Create New Class中: name:输入MsgTr ...
- Java注解-元数据、注解分类、内置注解和自定义注解|乐字节
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...
随机推荐
- LightOj1385 - Kingdom Division(数学几何题)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1385 题意:下图中已知面积 a b c 求 d; 如果d的面积不确定,输出-1. 连接 ...
- mysql日期加减
mysql日期加减一.MySQL 为日期增加一个时间间隔:date_add().1. 示例:set @dt = now();select date_add(@dt, interval 1 day); ...
- LeetCode Intersection of Two Linked Lists
原题链接在这里:https://leetcode.com/problems/intersection-of-two-linked-lists/ 思路:1. 找到距离各自tail 相同距离的起始List ...
- 使用iptables防火墙限制web的访问PV
使用iptables防火墙限制web的访问PV #!/bin/bash while true;do awk '{print $1}' /tmp/test/access.log| grep -v &qu ...
- JQuery:JQuery设置HTML
JQuery:设置HTML1.Query - 设置内容和属性设置内容 - text().html() 以及 val()我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元 ...
- JQuery:JQuery捕获HTML
JQuery:捕获HTML1.jQuery - 获取内容和属性介绍: jQuery 拥有可操作 HTML 元素和属性的强大方法. jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuer ...
- loop_nslookup
function loop_nslookup() { $baseFolder = "D:\ps_toolkit" $ip_list = "$baseFolder\ip_l ...
- Java基础——数组Array
一.数组基本概念 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组有三 ...
- 为何C语言(的函数调用)需要堆栈,而汇编语言不需要
转自:Uboot中start.S源码中指令级的详尽解析 green-waste为何 C 语言(的函数调用)需要堆栈,而汇编语言却需要堆栈之前看了很多关亍uboot的分析,其中就有说要为C语言的运行,准 ...
- iOS -Swift 3.0 -UIButton属性大全
// // ViewController.swift // Swift-UIButton // // Created by luorende on 16/9/9. // Copyright © ...