java jdk注解 使用_JDK 5.0 注解的使用,自定义注解

添加一个Student.java:

packagecom.zhengbin.annotationtest.anno;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/*** Created by zhengbin06 on 2016/10/15.*/@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)public @interfaceStudent {

String id()default "201370034217";

String name()default "郑斌";int age() default 21;

}

修改NeedTest.java:

@Retention(RetentionPolicy.RUNTIME) //①声明注解的保留期限

@Target(ElementType.METHOD) //②声明可以使用该注解的目标类型(这里表明该注解的目标类型是方法,查看@Target的实现,可以看到它的成员为ElementType类型的数组)

public @interface NeedTest { //③定义注解

boolean internal() default true; //④声明注解成员//注解成员的类型、成员名、与默认值

Student student();

}

在①和②处,我们所看到的注解是Java预定义的注解,成为元注解(Meta-Annotation),它们被Java编译器使用,会对注解类的行为产生印象。@Retention(RetentionPolicy.RUNTIME)表示NeedTest这个注解可以在运行期被JVM读取,注解的保留期限类型在java.lang.annotation.Retention类中定义,介绍如下:

@Retention,RetentionPolicy

d55727fd7abf0793355f40e3425db6d4.png

Target(ElementType.METHOD)表示NeedTest这个注解只能应用到目标类的方法上,注解的应用目标在java.lang.annotation.ElementType类中定义:

@Target,ElementType

36f2180ba537ee1ea10ba5c97b5a6c79.png

所有的注解类都隐式继承于java.lang.annotation.Annotation,但注解不允许显式继承于其他的接口。

使用注解

下面我们在ManageService.java中使用注解:

packagecom.zhengbin.annotationtest.service;importcom.zhengbin.annotationtest.anno.NeedTest;importcom.zhengbin.annotationtest.anno.Student;/*** Created by zhengbin06 on 2016/10/15.*/

public classManageService {

@NeedTest(student=@Student)// ①public voidaccessStudent() {

System.out.println("中工来了个小学弟!");

}

@NeedTest(internal= false, student = @Student(name = "郑斌" , age = 21))// ②public voidgraduateStudent() {

System.out.println("曾经的小学弟要毕业了。。。");

}

}

在①处,因为@NeedTest注解类的internal成员有默认值,所以在这里可以不用再进行赋值,但是student成员是一个注解类,所以必须申明出来,但同时也不必赋值,这样使用的就是声明的默认值

在②处,这是完整的声明和赋值

访问注解

前面提到过,注解不会直接影响程序的运行,但是第三方程序或工具可以利用代码中的注解完成特殊的任务,间接控制程序的运行。对于RetentionPolicy.RUNTIME保留期限的注解,我们可以通过反射机制访问类中的注解。

在JDK 5.0里,Package、Class、Constructor、Method以及Field等反射对象都新增了访问注解信息的方法:

T getAnnotation(Class annotationClass)

下面,我们就通过反射来访问注解,得出ManageService类中通过@NeedTest注解所承载的测试需求,如下:

packagecom.zhengbin.annotationtest.test;importcom.zhengbin.annotationtest.anno.NeedTest;importcom.zhengbin.annotationtest.service.ManageService;importjava.lang.reflect.Method;/*** Created by zhengbin06 on 2016/10/15.*/

public classTestTool {public static voidmain(String[] args) {

Class clazz= ManageService.class;

Method[] methods=clazz.getMethods();

System.out.println(methods.length);for(Method method : methods) {

NeedTest needTest= method.getAnnotation(NeedTest.class);if (needTest != null) {if (needTest.internal()) { //①

System.out.println("小学弟:"+needTest.student().name()); //②

}else{

System.out.println("毕业僧:"+needTest.student().name());

}

}

}

}

}

在①处,判断成员internal的值

在②处,获得成员student在ManageService中的注解信息

运行以上的代码,输出以下的信息:

11小学弟:郑斌

毕业僧:郑斌

方法个数为11,除了我们申明的两个,其它都是父类Object的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值