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的更多相关文章
随机推荐
- BZOJ1572: [Usaco2009 Open]工作安排Job
1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 775 Solved: 337[Submit ...
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...
- kafka-简单事例
开始创建项目,这里所用的工程结构是maven. 在pox.xml中添加kafka的依赖包,如下所示: <dependency> <groupId>org.apache.kafk ...
- Python文件中文编码问题
读写中文 需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,并且在第一行写: # encoding: utf-8 然后用以下代码: with codecs.o ...
- [转载]Linux服务器性能评估与优化
转载自:Linux服务器性能评估与优化 一.影响Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘I/O带宽 网络I/O带宽 2. 程序应用级 二.系统性能评估标准 影响性 ...
- HAProxy、Nginx 配置 HTTP/2 完整指南
基于最近对HTTP/2的争论和它的优势,是时候升级底层架构了.这篇文章将会介绍如何在安装和配置HAProxy和Ngnix(使用ssl终端).为了简化流程,我建议你准备好使用Docker镜像. 如果你想 ...
- Spring task任务调度详解
spring内部有一个task是Spring自带的一个设定时间自动任务调度 task使用的时候很方便,但是他能做的东西不如quartz那么的多! 可以使用注解和配置两种方式,配置的方式如下 引入Spr ...
- opentesty--luasocket 安装
转载请注明原文地址:http://www.cnblogs.com/dongxiao-yang/p/4878323.html luasocket安装过程中遇到不少坑,之前采用的是从公司以前服务器的里面找 ...
- maven打一个可执行的jar包
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-depen ...
- JAVA的可变类与不可变类
转自: http://www.blogjava.net/hilor/articles/150610.html 可变类和不可变类(Mutable and Immutable Objects)的初步定义: ...