Annotation详细介绍
转自:http://snkcxy.iteye.com/blog/1821512如约所致~ Annotation详细介绍博客分类:
- ?javaJava代码??
- package?com.cxy.annotation;??
- ??
- import?java.lang.annotation.ElementType;??
- import?java.lang.annotation.Retention;??
- import?java.lang.annotation.RetentionPolicy;??
- import?java.lang.annotation.Target;??
- import?java.lang.reflect.Method;??
- ??
- /**?
- ?*?@author?cxy?
- ?*/??
- public?class?AnnotationDetailTest??
- {??
- ????public?static?void?main(String[]?args)?throws?Exception??
- ????{??
- ????????CxyLogAp.Processor(Aclass.class);??
- ????}??
- }??
- ??
- /**?
- ?*?一个测试用的类,这个类的method1和method3被@CxyLog标记?
- ?*/??
- class?Aclass??
- {??
- ????@CxyLog??
- ????public?static?void?method1(){System.out.println("method1执行");}??
- ????public?static?void?method2(){System.out.println("method2执行");}??
- ????@CxyLog??
- ????public?static?void?method3(){System.out.println("method3执行");}??
- ????public?static?void?method4(){System.out.println("method4执行");}??
- }??
- ??
- /**?
- ?*?一个简单的annotation,打上这个标记的我们就给这个方法加入日志打印功能?
- ?*?1.@Retention(RetentionPolicy.RUNTIME)?解释:保留注释到程序运行?
- ?*?2.@Target(ElementType.METHOD)?解释:这个annotation是标记在方法上的?
- ?*/??
- @Retention(RetentionPolicy.RUNTIME)???
- @Target(ElementType.METHOD)???
- @interface?CxyLog{}???
- ??
- ??
- /**这个类是@CxyLog的annotation处理器?
- ?*/??
- class?CxyLogAp??
- {??
- ????//处理器?处理@CxyLog标记??
- ????public?static?void?Processor(Class?clz)?throws?Exception??
- ????{??
- ????????for(Method?m:clz.getMethods())??
- ????????{??
- ????????????//如果当前访问的方法打上了@CxyLog标识,那么就加入打印语句??
- ????????????if(m.isAnnotationPresent(CxyLog.class))??
- ????????????{??
- ????????????????m.invoke(null);??
- ????????????????System.out.println("日志:"+clz+"."+m.getName()+"执行!");??
- ????????????}else??
- ????????????{??
- ????????????????//因为他会执行所有的方法,包括父类的很多方法,所以这里我们限定一下只做我们定义的method开头的方法??
- ????????????????if(m.getName().contains("method"))??
- ????????????????{??
- ????????????????????m.invoke(null);??
- ????????????????}??
- ????????????}??
- ????????}??
- ????}??
- }??
- package?com.cxy.annotation;??
- ??
- import?java.lang.annotation.Annotation;??
- import?java.lang.annotation.ElementType;??
- import?java.lang.annotation.Retention;??
- import?java.lang.annotation.RetentionPolicy;??
- import?java.lang.annotation.Target;??
- import?java.lang.reflect.Method;??
- ??
- /**?
- ?*?@author?cxy?
- ?*/??
- public?class?AnnotationDetailTest1??
- {??
- ????public?static?void?main(String[]?args)?throws?Exception??
- ????{??
- ????????CxyAction.commonAuthoritymethod();??
- ????????CxyAction.advanceAuthoritymethod();??
- ????????System.out.println("=============================");??
- ????????//以下面的两种方式执行这两个方法??
- ????????CxyAuthorityAp.Processor(CxyAction.class,?"commonAuthoritymethod");??
- ????????System.out.println("------------------------------");??
- ????????CxyAuthorityAp.Processor(CxyAction.class,?"advanceAuthoritymethod");??
- ????}??
- }??
- ??
- /**?测试目标类,提供了两个不同权限的方法?
- ?*/??
- class?CxyAction??
- {??
- ????public?static?CxyBo?bo=new?CxyCommonBo();?//初始时候装配的是普通权限的bo??
- ??????
- ????//普通权限就能访问的方法??
- ????@CxyAuthority(authority="c",boName=CxyCommonBo.class)??
- ????public?static?void?commonAuthoritymethod()??
- ????{??
- ????????bo.doSomething();??
- ????}???
- ??????
- ????//高级权限能访问的方法???
- ????@CxyAuthority(authority="a",boName=CxyAdvancedBo.class)??
- ????public?static?void?advanceAuthoritymethod()??
- ????{??
- ????????bo.doSomething();??
- ????}???
- }??
- ??
- /**?一个接口为了演示动态装配而生?
- ?*/??
- interface?CxyBo??
- {??
- ????public?void?doSomething();??
- }??
- ??
- /**?普通权限的bo?
- ?*/??
- class?CxyCommonBo?implements?CxyBo??
- {??
- ????//普通业务逻辑??
- ????@Override??
- ????public?void?doSomething()??
- ????{??
- ????????System.out.println("执行:普通权限处理方法");??
- ????}??
- }??
- ??
- /**?高级权限的bo?
- ?*/??
- class?CxyAdvancedBo?implements?CxyBo??
- {??
- ????//高级业务逻辑??
- ????@Override??
- ????public?void?doSomething()??
- ????{??
- ????????System.out.println("执行:高级权限处理方法");??
- ????}??
- }??
- ??
- //权限annotation,根据这个标记的authority值来判断装配哪个业务逻辑类??
- @Retention(RetentionPolicy.RUNTIME)???
- @Target(ElementType.METHOD)???
- @interface?CxyAuthority??
- {??
- ????String?authority();?//代表权限??
- ????Class?boName();?//代表这个权限用什么bo去处理??
- }??
- ??
- /**这个类是@CxyAuthority的annotation处理器?
- ?*/??
- class?CxyAuthorityAp??
- {??
- ????//处理器?处理@CxyAuthority标记??
- ????public?static?void?Processor(Class?clz,String?methodName)?throws?Exception??
- ????{??
- ????????Method?m=clz.getMethod(methodName,?null);?//获得指定类的指定方法??
- ????????Annotation[]?aArray=m.getAnnotations();?//获得方法所有的annotation??
- ????????for(Annotation?one:aArray)??
- ????????{??
- ????????????if(one?instanceof?CxyAuthority)??
- ????????????{??
- ????????????????CxyBo?tempBo=(CxyBo)?((CxyAuthority)one).boName().newInstance();??
- ????????????????if("c".equals(((CxyAuthority)one).authority()))??
- ????????????????{??
- ????????????????????System.out.println("装配信息:普通权限bo装配成功");??
- ????????????????????//这里还可以做一些权限控制的操作??
- ????????????????}else?if("a".equals(((CxyAuthority)one).authority()))??
- ????????????????{??
- ????????????????????System.out.println("装配信息:高级权限bo装配成功");??
- ????????????????????//这里还可以做一些权限控制的操作??
- ????????????????}??
- ????????????????tempBo.doSomething();??
- ????????????}??
- ????????}??
- ????}??
- }??

?
结果图:
? ??
?
例二:
Java代码??
?结果图:
? ??
?
?
声明:
1.原创文章,转载请标明并加本文连接。
2.文章反映个人愚见,如有异议欢迎讨论指正