java中注解的使用_java中注解的使用
使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节。注解就是用于修饰类、全局变量、方法、参数或局部变量的接口,java中规定,注解的使用不允许影响其修饰类的存在,也就是说如果将一个类的注解全部删除,这个类也能够编译通过。java中,注解的应用主要有四个方面:类注解,全局变量注解,方法注解,参数注解。其他的还有诸如包注解和局部变量注解这里暂不作讨论。首先我们定义一个类注解如下:
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TypeAnnotation {
String say() default "this is a type annotation";
}
在java中有四个元注解,分别是@RetentIon、@Target、@Inherited和@Document,@Retention指定的是注解的生命周期,其value参数的值有三个:RUNTIME、SOURCE、CLASS。RUNTIME表示当前修饰的注解是在虚拟机运行时实时加载的,也就是虚拟机中要用到该注解一次就加载一次;CLASS表示该注解在类的源文件和编译后的class文件中都存在,而在类加载器加载到虚拟机中时就会消失,SOURCE表示该注解只在源文件中存在,当编译成class文件后就不存在了。@Target指定的是当前注解可修饰的类型,可value参数可取如下几个值:Type、FIELD、METHOD、PARAMETER、PACKAGE、CONSTRUCTOR、LOCAL_VARIABLE、ANNOTATION_TYPE等。其中最主要的应用有TYPE、FIELD、METHOD、PARAMETER,其分别表示类注解,全局变量注解,方法注解,参数注解,其余几个则表示包注解,构造器注解,局部变量注解,用于注解的注解等。
注解的声明同接口的声明类似,不过要在interface关键字前加@修饰以标明其为一个注解,在使用注解是括号中的变量名称也即注解声明时方法名称,声明方法时可以默认指定该方法的默认值,即在使用注解时若不指定该“变量”则该“变量”使用该方法的默认值,这里需要说明的是,若方法名称为value,那么在使用注解时,注解中该“变量名”可以不写,如上述Retention注解中的值(这种写法要求使用该注解时只指定这一个方“变量”的值)。
如下示例我们分别演示了四个常用注解的声明方式:
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldAnnotation {
String say() default "this is a field annotation";
}
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {
String say() default "this is a method annotation";
}
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ParamAnnotation {
String say() default "this is a parameter annotation";
}
由于注解的使用已经非常广泛,下面我们通过一个类来简单演示注解的使用:
package source;
import annotation.FieldAnnotation;
import annotation.MethodAnnotation;
import annotation.ParamAnnotation;
import annotation.TypeAnnotation;
@TypeAnnotation(say = "this is modified type annotation")
public class Apple {
@FieldAnnotation(say = "this is modified field annotation")
private String color;
@MethodAnnotation(say = "this is modified method annotation")
public void setColor(@ParamAnnotation String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
由于java规定,注解的使用不能对其使用类的存在产生影响,因而注解对于使用类只能起到一定的辅助作用,一个非常好的应用实例为javaweb中的权限控制,我们可以预定义一些权限码,然后在需要权限校验的地方使用自定义的注解;不过,因为java支持反射,因而通过反射注解就可以与使用类非常好的配合在一起,从而实现某些功能,一个非常好的例子是spring中的实体类对象属性的注入。下面我们通过一个简单的例子来说明如何通过反射获取注解值,并且利用反射使其与使用类产生关系:
package test;
import annotation.FieldAnnotation;
import annotation.MethodAnnotation;
import annotation.ParamAnnotation;
import annotation.TypeAnnotation;
import source.Apple;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
import org.junit.Test;
public class App {
@Test
public void testApp() throws Exception {
Apple apple = Apple.class.newInstance();
// 获取被注释的类
if (Apple.class.isAnnotationPresent(TypeAnnotation.class)) {
System.out.println(Apple.class.getAnnotation(TypeAnnotation.class).say());
}
// 获取被注释的变量
Field[] fields = Apple.class.getDeclaredFields();
for (Field f : fields) {
if (f.isAnnotationPresent(FieldAnnotation.class)) {
System.out.println(f.getAnnotation(FieldAnnotation.class).say());
}
}
// 获取被注释的方法
Method[] methods = Apple.class.getDeclaredMethods();
for (Method m : methods) {
if (m.isAnnotationPresent(MethodAnnotation.class)) {
System.out.println(m.getAnnotation(MethodAnnotation.class).say());
}
// 获取当前方法被注释的参数
Parameter[] parameters = m.getParameters();
for (Parameter p : parameters) {
if (p.isAnnotationPresent(ParamAnnotation.class)) {
System.out.println(p.getAnnotation(ParamAnnotation.class).say());
}
}
// 通过反射调用方法
if (m.getName().startsWith("set")) {
m.invoke(apple, "Red");
}
}
System.out.println("通过反射调用对象的方法后对象变量的值:" + apple.getColor());
}
}
运行结果如下:
this is modified type annotation
this is modified field annotation
this is modified method annotation
this is a parameter annotation
通过反射调用对象的方法后对象变量的值:Red
上述示例简单的阐述了反射和注解之间紧密的联系。在实际应用中, 注解的使用非常广泛,通过注解可以大大简化我们的开发,并且实现某些特定的效果,本文对注解的创建,使用以及深层调用方式进行了简单的介绍,希望大家能够喜欢!
相关文章:

水题/poj 1852 Ants
1 /*2 PROBLEM:poj18523 AUTHER:Nicole4 MEMO:水题5 */6 #include<cstdio>7 using namespace std;8 int cmax(int a,int b){return a>b?a:b;}9 int cmin(int a,int b){return a<b?a:b;} 10 int main() 11 { 12 int cases; 13 scanf("%d…

素数、最大公约数、最下公倍数、质因数分解
2013-08-18 11:20:43 素数、最大公约数、最下公倍数、质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解。 小结: 求1到n之间的素数的基本方法是通过遍历2到sqrt(n),判断每个数是否是素数来得到,…

Spring注解 开发
转载于:https://www.cnblogs.com/JBLi/p/10489541.html

读书:个人成长 -- 即兴演讲
与人交流时,有人发言语无伦次,舌头像打了结。 有人一开讲便滔滔不绝,却毫无重点。 也有人说话索然无味,没法让你投以关注。 如何在任何场合游刃有余地表达? 如何掌控此时此刻,用说话影响他人? …

php mysql环境搭配_centos6.7下搭配apache php mysql环境
安装过程安装apacheapache默认端口为80, 而nginx默认端口也是80, 所以安装apache前, 检查是否安装了nginx, 确保80端口没有被占用, 然后执行以下命令安装apacheyum install httpd httpd-devel启动apache服务/etc/init.d/httpd start或service httpd start停止apache服务/etc/in…

我们如此努力,也不过是个普通人
http://www.nowamagic.net/librarys/eight/posts/2500文 / 張君雅 南方日报曾刊登了一条新闻,大意是说有个女孩子以她的成绩考入北大清华没问题。但她从小参加各种社会活动,深受曾留学法国的母亲“生命的意义在于体验最多而不是最好”影响,决…

Citrix XenServer@cloudstack基本功能测试报告2
Cloudstack功能测试1、创建Zone、Pod、Clusters,添加hosts、Primary Storage、Secondary Storage步骤:1、 登录cloudstack控制板2、 选择基础架构,选择区域,点击查看全部,然后点击添加区域3、 选择基本区域类型4、 输入…

ABP中的Filter(下)
接着上面的一个部分来叙述,这一篇我们来重点看ABP中的AbpUowActionFilter、AbpExceptionFilter、AbpResultFilter这三个部分也是按照之前的思路来一个个介绍,当然这里面如果和前面的Interceptor有重复的部分,那么将会对两者进行一个对比并作出…

LRU算法 -- 链表 完整实现
LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统。 属于 我们操作系统设计中的 时间局部性原理,最长时…

python getostime_python中sys,os,time模块的使用(包括时间格式的各种转换)
sys模块sys.argv: 实现从程序外部向程序传递参数。位置参数argv[0]代表py文件本身,运行方法 python xx.py 参数1,参数2 。。self sys.argv[0]name sys.argv[1]age sys.argv[2]print self, name, agesys.getdefaultencoding(): 获取系统当前编码&#…

关于SpringMVC和Struts2的区别
1. 与struts2不同 1、 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。 2、 springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,…

DC-RC加固修补型砂浆
DC-RC加固修补型砂浆www.hrbjg.net一、DC-RC加固修补型砂浆的产品特点:1、耐火、耐高温、耐腐蚀、耐老化性能优良。2、强度高,抹灰操作性好。3、与原混凝土结构的粘结性能良好。4、无收缩,基本不会产生裂缝。5、二氧化碳、氯化物等透过性差&a…

类,实例,属性习题
class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.restaurant_namerestaurant_name self.cuisine_typecuisine_type def describle_restaurant(self): print("打印的第一条消息") print("打印的第…

数据结构和算法 -- 学习导图
数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步。 以下为今后持续…

HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,仅仅有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买…

java 彩票系统_JAVA版彩票随机生成系统
import java.io.*;import java.util.Random;class num{public static void main(String[]args){//声明一个随机数组int sjsh[]new int[7];int sum;try{InputStreamReader anew InputStreamReader(System.in);BufferedReader bnew BufferedReader(a);System.out.println ("…

Windows Server 2012 文件服务器群集
概述:之前已经测试了Windows Server 2012系统群集、Hyper-V群集,接下来将测试Windows Server 2012 文件服务器群集功能。实验环境:4台服务器都为Windows Server 2012 DataCenter操作系统在之前配置了群集的基础上,SRV2012服务器新…

023 判断出栈顺序是否正确
1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3…

栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)
文章目录实现顺序栈实现链式栈实现应用函数栈 的应用表达式求值中 的应用括号匹配中 的应用我们使用浏览器的时候经常会用到前进、后退功能。依次访问完一串页面 a – b – c之后点击后退功能,则能够依次看到c – b – a的页面。但是这个过程中,如果后退…

OC中的NSArray和NSMutableArray、NSDictionary和NSMutableDictionary用法
一:NSArray 和NSMutableArray1: NSArray:不可变数组NSArray是OC中使用的数组,只能用来存放OC对象,不能存放非OC对象如基本数据类型它使不可变的,一旦初始化完毕,内容不能改变,也不能添加元素。而…

java中ContentArea_java中TextArea怎么加载指定路径的文本内容
展开全部这设计到IO操作,很62616964757a686964616fe58685e5aeb931333332643334久以前练手写的加载文本到文本域的界面。具体代码第一步:得到一个File对象,需要参数文本路径File file new File("C:\\test.txt");第二步:…

文本分类技术基础
分类体系 分类:给定一个对象,从一个事先定义好的分类体系中挑出一个或多个最适合该对象的类别。 文本分类(TC, Text Categorization):在给定的分类体系下,根据文本内容自动的确定文本关联的类别。从数学角度看,文本分类…

C# 返回值为 listT
public List<T> test<T>(List<T> EntityList) where T : class{return EntityList;} 转载于:https://www.cnblogs.com/enych/p/10497312.html

ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析
文章目录内存查看内存控制内存控制源码分析通过gperftools接口获取osd进程实际内存 动态设置cache大小动态调整cache比例trim释放内存本文通过对ceph-osd内存查看跟踪的5种手段以及osd内存控制的方式进行源码层面的说明,并未通过修改相关源码进行控制(水…

c语言函数库学习~sscanf~格式化输入
---恢复内容开始--- 今天算是被打击到了吧,由郑轻的acm老师来我学院指导安排了个现场的小比赛,,俺们居然有还是输给一个大一的新手,,哎,情何以堪,,所以还是要重视下基础编程能力的培…

java mobile phone games_j2me100-src Java
文件名大小更新时间codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.class8192003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BorderLayoutDemo.java5752003-07-07codesc.net\[J2SE]应用编程150例\chap01\实例1\BoxLayoutFrame.class7262003-07-15code…

***突然断开可能是ADSL猫惹的祸
在我们使用服务器的时候,最讨厌的就是无故的断线了,可能正在和好一起副本,或者正在视频热聊中,还或者youtube视频看的正起劲,突然windows一个对话框弹出 - “连接已经断开”。实在是太影响体验了,断开之后&…

文件中数组的最大值及其对应的最小下标
2019年春季学期第二周作业基础作业请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。 输入:请建立以自己英文名字命名的txt文…

ceph bluestore源码分析:admin_socket实时获取内存池数据
环境: 版本:ceph 12.2.1 部署完cephfs 使用ceph-fuse挂载,并写入数据 关键参数: debug_mempool true 将该参数置为true即可查看详细的blustore管理的内存池的数据 命令: ceph daemon osd.id dump_mempools该命令为ad…

java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...
通常,当我插入4000个字符限制时,它的工作正常,但当超过4000个字符时,它抛出SQL异常字符串文字太长,即使我的DISCHARGE_TEXT数据类型是CLOB我的JavaScript代码是function saveAsDraftNew(){var admissionNo document.g…