1.2.4 Java Annotation 提要
(本文是介绍依赖注入容器Spring和分析JUnit源码的准备知识)
Java Annotation(标注)
java.lang.annotation.Annotation是全部Java标注的父接口。它除了override/改写Object的equals(Object)、hashCode()和toString()外,仅有一个方法
Class<? extends Annotation> annotationType()
返回本标注的的类型。
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override{}
再如java.lang. FunctionalInterface。
@Documented
@Retention(value=RUNTIME)
@Target(value=TYPE)
public @interface FunctionalInterface
......
这些样例反映标注的一些基本内容:
有一些用于修饰自己定义标注的标注——称为元标注/meta-annotation,如Override样例中的@Target、@Retention和@Documented。其后是括号,括号里是使用逗号切割的名值对。(name=value)。
@Target说明被修饰的标注的适用场合/目标。
其值由枚举java.lang.annotation.ElementType限定,包含ANNOTATION_TYPE , CONSTRUCTOR , FIELD , LOCAL_VARIABLE , METHOD ,PACKAGE , PARAMETER , TYPE和TYPE_PARAMETER。
比如Target自己的适用场合是@Target(value=ANNOTATION_TYPE);假设标注仅仅有单一属性成员(名值对),而并成员名为"value="能够省略为@Target(ANNOTATION_TYPE)。
@Retention说明被修饰的标注的保留策略,由RetentionPolicy枚举。
- SOURCE仅仅会保留在程序源代码里。或者说仅对编译器有效,如@Override。编译器检查
- 默认或指定CLASS时,指定该标注写入class文件,可是不会把这些信息载入到JVM中;
- RUNTIME表示能够通过反射机制获得该标注。
@Documented指明该标注被反映在JavaDoc中。
可是,程序能够解析RUNTIME标注。并决定代码的行为。
样例:JUnit4自己定义的annotation
org.junit.Test
org.junit.Ignore @Target({ElementType.METHOD, ElementType.TYPE})
@Before和@After标示的方法仅仅能各有一个,代替了JUnit曾经版本号中的setUp和tearDown方法
org.junit.BeforeClass @Target(ElementType.METHOD)
org.junit.Before @Target(ElementType.METHOD)
org.junit.AfterClass @Target(ElementType.METHOD)
org.junit.After @Target(ElementType.METHOD)
org.junit.runner.RunWith
org.junit.runners.Suite.SuiteClasses
org.junit.runners.Parameterized.Parameters
解析RUNTIME标注
package MyTest;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
String value();
}
②标注的使用类
package MyTest;
public class HelloWorld {
@MyAnnotation("Test")
public double add(double m,double n){
return m+n;
}
@MyAnnotation("Ignore")
public double add2(double m,double n){
return m+n;
}
}
package MyTest;
import java.lang.annotation.*;
import java.lang.reflect.*;
public class TestHelloWorld{
public static void main(String[] args)throws Exception{
//直接使用反射机制
Class<?> c = MyTest.HelloWorld.class;
HelloWorld h =(HelloWorld)c.newInstance();
Method[] methods = c.getMethods();
for(Method method:methods){
Annotation[] annotations = method.getDeclaredAnnotations();
for(Annotation annotation : annotations){
if(annotation instanceof MyAnnotation){
MyAnnotation myAnnotation = (MyAnnotation) annotation;
System.out.println("value: " + myAnnotation.value());
if(myAnnotation.value().equals("Test") ){
double d = (Double)method.invoke(h,1,2.0);
System.out.println(d);
}
}
}
}
}
}
输出:
3.0
value: Ignore
1.2.4 Java Annotation 提要的更多相关文章
- Java Annotation概述
@(Java)[Annotation|Java] 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认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- 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对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互 ...
随机推荐
- 一个简单RPC框架是怎样炼成的(II)——制定RPC消息
开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 以下,我们先看一个普通的过程调用 class Client(object): def _ ...
- JavaScript中的*top、*left、*width、*Height具体解释
来源:http://www.ido321.com/911.html html代码 1: <body> 2: <div class="father" id=&quo ...
- 实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)
stl算法中有个copy函数.我们能够轻松的写出这种代码: #include <iostream> #include <algorithm> #include <vect ...
- js32---CommonUtil.js
// BH 命名空间 namespace var BH = {} ; BH.Interface = function(name,methods){ //Interface是类.方法的名字,以后用BH. ...
- 2.4 Connect API官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 2.4 Connect API The Connect API allows imp ...
- 轻松学习Linux之Shell预定义变量
本文出自 "李晨光原创技术博客" 博客,谢绝转载!
- Javascript 继承和克隆
个人总结: call 继承的是父类私有 prototype 继承的父类公有 create 可以将公有或私有继承到子类上去(克隆) for in 克隆 不管公有还是私有的都克隆成私有的 1.原型继承:将 ...
- Docker 搭建java+tomcat
1. 准备java和tomcat的软件包 jdk-7u79-linux-x64.tar.gz apache-tomcat-7.0.57.tar.gz 2. 编辑Dockerfile 文件 vim Do ...
- 如何使用maven 打包源代码呢?
如何使用maven 打包源代码呢? http://hw1287789687.iteye.com/blog/1943157
- [Python] The get() method on Python dicts and its "default" arg
# The get() method on dicts # and its "default" argument name_for_userid = { 382: "Al ...