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
最新文章
- mac机上搭建php56/nginx 1.8.x/thinkphp 3.2.x/gearman扩展/seaslog扩展/redis扩展环境
- 05.virsh命令的常用操作(kvm)
- [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.
- Windows7下面手把手教你安装Django
- HDU 3577 Fast Arrangement (线段树区间更新)
- uva 10791
- 修改UILabel的行间距
- Solr 多核(MultiCore)配置
- VS2010安装与测试编译问题(fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt)
- POJ 2986 A Triangle and a Circle
- UVA1291----Dance Dance Revolution----3维DP
- 01.PHP5.x编译详解
- UR11 A.元旦老人与汉诺塔
- python 的bif
- Google弃用HttpClient 而推荐使用HttpURLConnection的原因
- 解决bootstrap多模态框跳转时页面左移问题
- SpringBoot整合MyBatis(注解版)
- Sqoop 介绍、安装及环境配置
- Redis 2.8.18 安装报错 error: jemalloc/jemalloc.h: No such file or directory解决方法
- shell习题第8题:监控nginx的502状态
热门文章
- [React] Use a Render Porp
- Linux-清除rootpassword
- 利用js 获取本日 本周 本月时间代码
- Java学习笔记三
- var、let和const的区别
- 18/9/16牛客网提高组Day2
- ArcEngine的ToolbarControl解析
- 关于android主线程异常NetworkOnMainThread不能訪问网络
- SQL server 2012 安装SQL2012出现报错: 启用 Windows 功能 NetFx3 时出错
- 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)