Java Annotation详解(二): 反射和Annotation
前面一篇文《Java
Annotation详解(一): 理解和使用Annotation》中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation偶尔为了消除警告会使用下,自定义Annotation大家在实际的开发中应该都没有用过。其实呢,我在毕业后一年的工作里,也从未自定义使用过Annotation,只是在多处开发中使用过注释方便的内容,比如Servlet,Spring以及一些优秀的Android开源类库。 如果从简单的开发来讲,大家基本会使用一些开源的工具(只使用Annotation编写的)就好了,但是,如果大家能深入的了解Annotation,对大家学习这些开源框架将更有帮助。
Annotation何时才变得有意义呢? 如果结合反射,取得Annotation中设置的全部内容,Annotation的意义才会被最大化。
在以下的类中Class Constructor Field Method Package等类都实现了AnnotatedElement接口
在接口中有以下重要的方法:
· getAnnotations(Class annotationType)获取一个指定的annotation类型
· getAnnotations() 获取所有的Annotation
· getDeclaredAnnotations() 获取声明过的所有Annotation
· isAnnotationPresent(Class<? extends Annotation> annotationClass)这个annotation是否出现
通过这些方法,配合反射我们就可以在程序运行时拿到注解的内容了,例子如下:
首先定义一个普通的含有内建注释的类:
package com.test.reflectannotation ;
public class SimpleBeanOne{
@SuppressWarnings("unchecked")
@Deprecated
@Override
public String toString(){
return "Hello World!!!" ;
}
};
接下来,我们通过反射取出Annotation内容要注意,只有Deprecated的Annotation的定义范围是RUNTIME范围,所以此时通过反射的话,只能取得一个。
import java.lang.annotation.Annotation ;
import java.lang.reflect.Method ;
public class ReflectDemo01{
public static void main(String args[]) throws Exception{ // 所有异常抛出
Class <?> c = null ;
c = Class.forName("com.test.SimpleBeanOne") ;
Method toM = c.getMethod("toString") ; // 找到toString()方法
Annotation an[] = toM.getAnnotations() ; // 取得全部的Annotation
for(Annotation a:an){ // 使用 foreach输出
System.out.println(a) ;
}
}
};
输出:
@java.lang.Deprecated()
以上,我们取得的是内建的Annotation,接下来,我们自己定义一个Annotation:
package com.test.reflectannotation ;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
@Retention(value=RetentionPolicy.RUNTIME) // 此Annotation在类执行时依然有效
public @interface MyDefaultAnnotationReflect{
public String key() default "Linkage" ;
public String value() default "沉缘" ; }
我们通过RetentionPolicy指定了其值为RUNTIME,在运行时有效。
package com.test.reflectannotation ;
public class SimpleBeanTwo{
@SuppressWarnings("unchecked")
@Deprecated
@Override
@MyDefaultAnnotationReflect(key="Baidu",value="www.baidu.com")
public String toString(){
return "Hello World!!!" ;
}
};
通过反射取得指定的Annotation,因为现在唯一设置的内容就是MyDefaultAnnotationReflect。
import org.lxh.demo16.reflectannotation.MyDefaultAnnotationReflect ;
import java.lang.annotation.Annotation ;
import java.lang.reflect.Method ;
public class ReflectDemo{
public static void main(String args[]) throws Exception{ // 所有异常抛出
Class <?> c = null ;
c = Class.forName("com.test.reflectannotation.SimpleBeanTwo") ;
Method toM = c.getMethod("toString") ; // 找到toString()方法
if(toM.isAnnotationPresent(MyDefaultAnnotationReflect.class)){
// 判断是否是指定的Annotation
MyDefaultAnnotationReflect mda = null ;
mda = toM.getAnnotation(MyDefaultAnnotationReflect.class) ; // 得到指定的Annotation
String key = mda.key() ; // 取出设置的key
String value = mda.value() ; // 取出设置的value
System.out.println("key = " + key) ;
System.out.println("value = " + value) ;
}
}
};
输出:
key = Baidu
value = www.baidu.com
总结:
Annotation在实际的开发中,不管如何使用,其最终肯定结合反射机制,也就是说可以通过Annotation设置一些内容到方法上去,已完成特定的功能。
此外,发现有篇博客写的不错,是关于注解和反射的,可以参考:http://blog.csdn.net/a396901990/article/details/27961663
Java Annotation详解(二): 反射和Annotation的更多相关文章
- Java Annotation详解 理解和使用Annotation
系统中用到了java注解: 查了一下如何使用注解,到底注解是什么: (1)创建方法:MsgTrace Java Class==> 在Create New Class中: name:输入MsgTr ...
- Java多线程详解(二)
评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡 ...
- Java集合详解二
前一篇我们已经讲过了Collectin是存放单值的最大接口, 可以看到Map接口和其主要之类的关系图如下: 快速访问 HashMap HashTable TreeMap Map输出 那Map ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- Java接口 详解(二)
上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用—工厂设计模式(Factory) 我们先看一个范例: package com. ...
- Shiro 安全框架详解二(概念+权限案例实现)
Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java泛型详解(转)
文章转自 importNew:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理 ...
- Java Servlet详解(体系结构+注解配置+生命周期)
Java Servlet详解(注解配置+生命周期) 什么是Servlet : (Server applet)? 顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(To ...
随机推荐
- maven本地仓库有jar包,maven install还是报错识别不到
去本地仓库对应jar的目录下看下,有一个 _remote.repositories 的文件打开 ***.pom>xxx=***.jar>xxx= 这个 xxx 就是你maven的setti ...
- NOIP模拟 17.8.16
NOIP模拟17.8.16 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...
- CentOS上搭建Yii2 --2017
1.安装composer(作曲家?好像是php的包管理,类似python中的pip) #安装 curl -sS https://getcomposer.org/installer | php #移动到 ...
- 【机器学习PAI实战】—— 玩转人工智能之利用GAN自动生成二次元头像
前言 深度学习作为人工智能的重要手段,迎来了爆发,在NLP.CV.物联网.无人机等多个领域都发挥了非常重要的作用.最近几年,各种深度学习算法层出不穷, Generative Adverarial Ne ...
- MySQL遇到经典例子--(遇到就写)
1,一般的搜索只会搜索标题,也有特殊的情况,就是标题和内容一起搜索! -- 模糊搜索只是搜索标题 $sql = "select count(*) as sum from publish wh ...
- hadoop生态系统默认port集合
版权声明:本文为博主John Lau原创文章.未经博主同意不得转载 https://blog.csdn.net/GreatElite/article/details/24651569 1 H ...
- Auto reloading enabled
在eclipse中集成tomcat来开发时, 如果使用run as模式启动项目的话,tomcat配置Auto reloading enabled,我们修改java文件,项目会重新加载,修改的内容会生效 ...
- bzoj1179 Atm
Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...
- Python学习之路4☞条件和循环
一.if语句 1.1 功能 计算机又被称作电脑,意指计算机可以像人脑一样,根据周围环境条件(即expession)的变化做出不同的反应(即执行代码) if语句就是来控制计算机实现这一功能 1.2 语法 ...
- 通过 FastAdmin 理解开源软件
通过 FastAdmin 理解开源软件 开源软件 ≠ 免费软件,免费是遵循其开源协议下的一个特性. 开源软件虽然免费,但服务是可以收费的,因为房子要钱. 开源的目的是为了用户更自由. 做开源每天会遇到 ...