java_annotation_02
通过反射取得Annotation
在一上节中,我们只是简单的创建了Annotation,如果要让一个Annotation起作用,则必须结合反射机制,在Class类上存在以下几种于Annotation有关的方法
-- public <A extends Annotation> A getAnnotation(class<A> annotationClass)
如果在一个元素中存在注释,则取得全部注释
-- public Annotation[] getAnnotations()
返回此元素上所有注释
-- public Annotation[] getDeclaredAnnotations()
返回直接存放在此元素上的所有注释
-- public boolean isAnnotation()
判断元素是否表示一个注释
-- public boolean isAnnotationPersent(Class<? extends Annotation> annotationClass)
判断一个元素上是否存在注释
例一:取得全部的Annotation
1.定义一个具体3个Annotation的类
public class MyTest{
@SuppressWarnings("unchecked")
@Deprecated
@Override
public String sayHello(){
return "Hello WangYang!!!" ;
}
};
2.想要出得上面的Annotation,则必须首先找到他们属于的方法
import java.lang.annotation.Annotation ;
import java.lang.reflect.Method ;
public class ReflectTest{
public static void main(String args[]) throws Exception{ // 所有异常抛出
Class <?> c = null ;
c = Class.forName("com.wy.MyTest") ;
Method toM = c.getMethod("sayHello") ; // 找到sayHello()方法
Annotation an[] = toM.getAnnotations() ; // 取得全部的Annotation
for(Annotation a:an){ // 使用 foreach输出
System.out.println(a) ;
}
}
};
注意:
上面虽然用了3个Annotation,但是最后真正得到的只有一个.这是因为只有@Deprecated使用了RUNTIME的声明方式
例二:我们不单单要取得了一个元素所声明的全部RUNTIME的Annotation,有时需要取得的是某个指定的Annotation,所以此时在取得之前就必须进行明确的判断,使用isAnnotationPresent()方法进行判断.
1.同样定义一个RUNTIME的Annotation
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
@Retention(value=RetentionPolicy.RUNTIME) // 此Annotation在类执行时依然有效
public @interface MyAnnotation{
public String key() default "wang" ;
public String value() default "yang" ; }
2.定义一个类,并使用自定义的Annotation
public class MyAnnotationTest2{
@SuppressWarnings("unchecked")
@Deprecated
@Override
@MyDefaultAnnotationReflect(key="wang",value="www.yang.cn")
public String sayHello(){
return "Hello WangYang!!!" ;
}
};
3.取得指定的Annotation
import com.wy.MyAnnotation ;
import java.lang.annotation.Annotation ;
import java.lang.reflect.Method ;
public class MyTest{
public static void main(String args[]) throws Exception{ // 所有异常抛出
Class <?> c = null ;
c = Class.forName("com.wy.MyAnnotationTest2") ;
Method toM = c.getMethod("sayHello") ; // 找到sayHello()方法
if(toM.isAnnotationPresent(MyAnnotation .class)){
// 判断是否是指定的Annotation
MyAnnotation mda = null ;
mda = toM.getAnnotation(MyAnnotation .class) ; // 得到指定的Annotation
String key = mda.key() ; // 取出设置的key
String value = mda.value() ; // 取出设置的value
System.out.println("key = " + key) ;
System.out.println("value = " + value) ;
}
}
};
以上的方式,我们加以合理的应用,就能实现我们想要的注释
java_annotation_02的更多相关文章
随机推荐
- STM32F10x 学习笔记6(USART实现串口通讯 2)
这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...
- POJ3126 Prime Path(BFS)
题目链接. AC代码如下: #include <iostream> #include <cstdio> #include <cstring> #include &l ...
- phpMyAdmin view_create.php 跨站脚本漏洞
漏洞名称: phpMyAdmin view_create.php 跨站脚本漏洞 CNNVD编号: CNNVD-201307-066 发布时间: 2013-07-05 更新时间: 2013-07-05 ...
- 工资表的生成、显示、修改工资,应用transactionscope 分布式事务
一: 二:SalarySheetDAL.cs using System; using System.Collections.Generic; using System.Linq; using Syst ...
- floyd详解
就不在来回搬了 请看 http://note.youdao.com/groupshare/?token=6422E952998F4381A1534B71359EFA57&gid=1579165 ...
- 尚学堂 JAVA DAY12 java程序执行时内存的分配
- hdu 4607 Park Visit (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r− ...
- J2EE 关于WebLogic下应用使用URL.openConnection获取连接返回 HttpsURLConnection与SOAPHttpsURLConnection的问题
J2EE 关于WebLogic下应用使用URL.openConnection获取连接返回 HttpsURLConnection与SOAPHttpsURLConnection的问题 2012年03月09 ...
- JSP简易留言板
写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...
- slides 带手势的图片滑动效果(用于移动终端)
slidesjs 是基于jQuery开发的一款功能强大,是简单的幻灯片插件,但是需要要应用于移动终端的话,还需要考虑手势滑动时候图片切换功能. 此次,我就在slidesjs基础上扩展了两个swipe属 ...