




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java注解(Annotation) (1) Annotation(注释)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注释是以注释名在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。元数据的作用如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:编写文档:通过代码里标识的元数据生成文档。代码分析:通过代码里标识的元数据对代码进行分析。编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。基本内置注释OverrideJava代码1. package com.iwtxokhtd.annotation; 2. /*3. * 测试Override注解4. * author Administrator5. *6. */ 7. public class OverrideDemoTest 8. 9. /Override 10. public String tostring() 11. return 测试注释; 12. 13. package com.iwtxokhtd.annotation;/* 测试Override注解* author Administrator*/public class OverrideDemoTest /Overridepublic String tostring()return 测试注释;Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的deprecated标记有相同的功能,准确的说,它还不如javadoc deprecated,因为它不支持参数,使用Deprecated的示例代码示例如下:Java代码1. package com.iwtxokhtd.annotation; 2. /*3. * 测试Deprecated注解4. * author Administrator5. *6. */ 7. public class DeprecatedDemoTest 8. public static void main(String args) 9. /使用DeprecatedClass里声明被过时的方法 10. DeprecatedClass.DeprecatedMethod(); 11. 12. 13. class DeprecatedClass 14. Deprecated 15. public static void DeprecatedMethod() 16. 17. package com.iwtxokhtd.annotation;/* 测试Deprecated注解* author Administrator*/public class DeprecatedDemoTest public static void main(String args) /使用DeprecatedClass里声明被过时的方法DeprecatedClass.DeprecatedMethod();class DeprecatedClassDeprecatedpublic static void DeprecatedMethod() SuppressWarnings,其参数有:deprecation,使用了过时的类或方法时的警告unchecked,执行了未检查的转换时的警告fallthrough,当 Switch 程序块直接通往下一种情况而没有 Break 时的警告path,在类路径、源文件路径等中有不存在的路径时的警告serial,当在可序列化的类上缺少 serialVersionUID 定义时的警告finally ,任何 finally 子句不能正常完成时的警告all,关于以上所有情况的警告Java代码1. package com.iwtxokhtd.annotation; 2. 3. import java.util.ArrayList; 4. import java.util.List; 5. 6. public class SuppressWarningsDemoTest 7. 8. public static List list=new ArrayList(); 9. SuppressWarnings(unchecked) 10. public void add(String data) 11. list.add(data); 12. 13. package com.iwtxokhtd.annotation;import java.util.ArrayList;import java.util.List;public class SuppressWarningsDemoTest public static List list=new ArrayList();SuppressWarnings(unchecked)public void add(String data)list.add(data);(2)自定义注释它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为interface,如下例:Java代码1. public interface NewAnnotation 2. public interface NewAnnotation 使用自定义的注释类型Java代码1. public class AnnotationTest 2. NewAnnotation 3. public static void main(String args) 4. 5. public class AnnotationTest NewAnnotationpublic static void main(String args) 为自定义注释添加变量Java代码1. public interface NewAnnotation 2. String value(); 3. public interface NewAnnotation String value();Java代码1. public class AnnotationTest 2. NewAnnotation(main method) 3. public static void main(String args) 4. saying(); 5. 6. NewAnnotation(value = say method) 7. public static void saying() 8. 9. public class AnnotationTest NewAnnotation(main method)public static void main(String args) saying();NewAnnotation(value = say method)public static void saying() 定义一个枚举类型,然后将参数设置为该枚举类型,并赋予默认值Java代码1. public interface Greeting 2. public enum FontColor 3. BLUE,RED,GREEN 4. ; 5. String name(); 6. FontColor fontColor() default FontColor.RED; 7. public interface Greeting public enum FontColorBLUE,RED,GREEN;String name();FontColor fontColor() default FontColor.RED; 这里有两种选择,其实变数也就是在赋予默认值的参数上,我们可以选择使用该默认值,也可以重新设置一个值来替换默认值Java代码1. NewAnnonation(main method) 2. public static void main(String args) 3. saying(); 4. sayHelloWithDefaultFontColor(); 5. sayHelloWithRedFontColor(); 6. 7. 8. NewAnnonation(say method) 9. public static void saying() 10. 11. 12. /此时的fontColor为默认的RED 13. Greeting(name=defaultfontcolor) 14. public static void sayHelloWithDefaultFontColor() 15. 16. 17. /现在将fontColor改为BLUE 18. Greeting(name=notdefault,fontColor=Greeting.FontColor.BLUE) 19. public static void sayHelloWithRedFontColor() 20. 21. NewAnnonation(main method)public static void main(String args) saying(); sayHelloWithDefaultFontColor(); sayHelloWithRedFontColor(); NewAnnonation(say method)public static void saying()/此时的fontColor为默认的REDGreeting(name=defaultfontcolor)public static void sayHelloWithDefaultFontColor() /现在将fontColor改为BLUEGreeting(name=notdefault,fontColor=Greeting.FontColor.BLUE)public static void sayHelloWithRedFontColor() (3)注释的高级应用限制注释的使用范围用Target指定ElementType属性Java代码1. package java.lang.annotation; 2. public enum ElementType 3. TYPE, 4. / 用于类,接口,枚举但不能是注释 5. FIELD, 6. / 字段上,包括枚举值 7. METHOD, 8. / 方法,不包括构造方法 9. PARAMETER, 10. / 方法的参数 11. CONSTRUCTOR, 12. /构造方法 13. LOCAL_VARIABLE, 14. / 本地变量或catch语句 15. ANNOTATION_TYPE, 16. / 注释类型(无数据) 17. PACKAGE 18. / Java包 19. package java.lang.annotation; public enum ElementType TYPE, / 用于类,接口,枚举但不能是注释FIELD, / 字段上,包括枚举值 METHOD, / 方法,不包括构造方法PARAMETER, / 方法的参数CONSTRUCTOR, /构造方法LOCAL_VARIABLE, / 本地变量或catch语句ANNOTATION_TYPE, / 注释类型(无数据) PACKAGE / Java包 注解保持性策略Java代码1. /限制注解使用范围 2. Target(ElementType.METHOD,ElementType.CONSTRUCTOR) 3. public interface Greeting 4. 5. /使用枚举类型 6. public enum FontColor 7. BLUE,RED,GREEN 8. ; 9. String name(); 10. FontColor fontColor() default FontColor.RED; 11. /限制注解使用范围Target(ElementType.METHOD,ElementType.CONSTRUCTOR)public interface Greeting /使用枚举类型public enum FontColorBLUE,RED,GREEN;String name();FontColor fontColor() default FontColor.RED;在Java编译器编译时,它会识别在源代码里添加的注释是否还会保留,这就是RetentionPolicy。下面是Java定义的RetentionPolicy枚举:编译器的处理有三种策略:将注释保留在编译后的类文件中,并在第一次加载类时读取它将注释保留在编译后的类文件中,但是在运行时忽略它按照规定使用注释,但是并不将它保留到编译后的类文件中Java代码1. package java.lang.annotation; 2. public enum RetentionPolicy 3. SOURCE, 4. / 此类型会被编译器丢弃 5. CLASS, 6. / 此类型注释会保留在class文件中,但JVM会忽略它 7. RUNTIME 8. / 此类型注释会保留在class文件中,JVM会读取它 9. package java.lang.annotation; public enum RetentionPolicy SOURCE, / 此类型会被编译器丢弃 CLASS, / 此类型注释会保留在class文件中,但JVM会忽略它 RUNTIME / 此类型注释会保留在class文件中,JVM会读取它 Java代码1. /让保持性策略为运行时态,即将注解编码到class文件中,让虚拟机读取 2. Retention(RetentionPolicy.RUNTIME) 3. public interface Greeting 4. 5. /使用枚举类型 6. public enum FontColor 7. BLUE,RED,GREEN 8. ; 9. String name(); 10. FontColor fontColor() default FontColor.RED; 11. /让保持性策略为运行时态,即将注解编码到class文件中,让虚拟机读取Retention(RetentionPolicy.RUNTIME)public interface Greeting /使用枚举类型public enum FontColorBLUE,RED,GREEN;String name();FontColor fontColor() default FontColor.RED;文档化功能Java提供的Documented元注释跟Javadoc的作用是差不多的,其实它存在的好处是开发人员可以定制Javadoc不支持的文档属性,并在开发中应用。它的使用跟前两个也是一样的,简单代码示例如下:Java代码1. /让它定制文档化功能 2. /使用此注解时必须设置RetentionPolicy为RUNTIME 3. Documented 4. public interface Greeting 5. 6. /使用枚举类型 7. public enum FontColor 8. BLUE,RED,GREEN 9. ; 10. String name(); 11. FontColor fontColor() default FontColor.RED; 12. /让它定制文档化功能/使用此注解时必须设置RetentionPolicy为RUNTIMEDocumentedpublic interface Greeting /使用枚举类型public enum FontColorBLUE,RED,GREEN;String name();FontColor fontColor() default FontColor.RED;标注继承Java代码1. /让它允许继承,可作用到子类 2. Inherited 3. public interface Greeting 4. 5. /使用枚举类型 6. public enum FontColor 7. BLUE,RED,GREEN 8. ; 9. String name(); 10. FontColor fontColor() default FontColor.RED; 11. /让它允许继承,可作用到子类Inheritedpublic interface Greeting /使用枚举类型public enum FontColorBLUE,RED,GREEN;String name();FontColor fontColor() default FontColor.RED;(4)读取注解信息属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度Java代码1. package com.iwtxokhtd.annotation; 2. import java.lang.annotation.Annotation; 3. import java.lang.reflect.Method; 4. 5. /读取注解信息 6. public class ReadAnnotationInfoTest 7. public static void main(String args)throws Exception 8. /测试AnnotationTest类,得到此类的类对象 9. Class c=Class.forName(com.iwtxokhtd.annotation.AnnotationTest); 10. /获取该类所有声明的方法 11. Method methods=c.getDeclaredMethods(); 12. /声明注解集合 13. Annotation annotations; 14. /遍历所有的方法得到各方法上面的注解信息 15. for(Method method:methods) 16. /获取每个方法上面所声明的所有注解信息 17. annotations=method.getDeclaredAnnotations(); 18. /再遍历所有的注解,打印其基本信息 19. for(Annotation an:annotations) 20. System.out.println(方法名为:+method.getName()+ 其上面的注解为:+an.annotationType().getSimpleName(); 21. Method meths=an.annotationType().getDeclaredMethods(); 22. /遍历每个注解的所有变量 23. for(Method meth:meths) 24. System.out.println(注解的变量名为:+meth.getName(); 25. 26. 27. 28. 29. 30. 31. 32. package com.iwtxokhtd.annotation;import java.lang.annotation.Annotation;import java.lang.reflect.Method;/读取注解信息public class ReadAnnotationInfoTest public static void main(String args)throws Exception /测试AnnotationTest类,得到此类的类对象Class c=Class.forName(com.iwtxokhtd.annotation.AnnotationTest);/获取该类所有声明的方法Method methods=c.getDeclaredMethods();/声明注解集合Annotation annotations;/遍历所有的方法得到各方法上面的注解信息for(Method method:methods)/获取每个方法上面所声明的所有注解信息annotations=method.getDeclaredAnnotations();/再遍历所有的注解,打印其基本信息for(Annotation an:annotations)System.out.println(方法名为:+method.getName()+ 其上面的注解为:+an.annotationType().getSimpleName();Method meths=an.annotationType().getDeclaredMethods();/遍历每个注解的所有变量for(Method meth:meths)System.out.println(注解的变量名为:+meth.getName();利用自定义Java注解实现资源注入这里是想介绍一下如何通过Java的注解机制,实现对bean资源的注入。主要介绍实现的方法,至于例子的实用性不必讨论。需求:一个应用有两个数据库,分别为DB-A,DB-B。假设持久层框架使用iBatis来实现,那么SqlMapClient对象在创建时,对于两个不同的DB连接要有两个不同的SqlMapClient对象,假设我们有一个Service类为MyService.java,该类中有两个SqlMapClient对象sqlMapA、sqlMapB分别对应着DB-A、DB-B。先看看我们的SqlMapClient.java类:(自定义SqlMapClient类,用来演示。)importjava.util.Map;mons.lang.builder.ToStringBuilder;mons.lang.builder.ToStringStyle;SuppressWarnings(unchecked)publicclassSqlMapClientpublicSqlMapClient(Strings,Stringt)sqlMap=s;type=t;publicSqlMapClient()privateStringtype=null;privateStringsqlMap=null;/get、set方法略/用于演示查询后返回一个String的返回结果publicStringselectForObject(Stringsql,Mapin)returnthis.toString();OverridepublicStringtoString()returnnewToStringBuilder(this,ToStringStyle.SHORT_PREFIX_STYLE).append(sqlMap,sqlMap).append(type,type).toString();MyService.java类实现:importjava.util.Map;SuppressWarnings(unchecked)publicclassMyServiceDataSource(type=B,sqlMap=com/annotation/sql-map-config-B.xml)privateSqlMapClientsqlMapB=null;DataSource(type=A,sqlMap=com/annotation/sql-map-config-A.xml)privateSqlMapClientsqlMapA=null;/get、set方法略/模拟在DB-B数据库取得数据publicStringselectForObjectFromB(Stringsql,Mapin)returnsqlMapB.selectForObject(,null);/模拟在DB-A数据库取得数据publicStringselectForObjectFromA(Stringsql,Mapin)returnsqlMapA.selectForObject(,null);接下来就是我们的注解类:DataSource.javaimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;Target(ElementType.FIELD)Retention(RetentionPolicy.RUNTIME)publicinterfaceDataSource/*/*Dao的类型*return*/Stringtype()defaultA;/连接的数据库类型AorBStringsqlMap()default;/Sql-Map-Config文件的路径,用于加载iBatis的SqlMapClient对象定义资源注入的接口 IFieldWiring.java。之所以这里要定义这个接口,是为了以后扩展用,我们很方便的定义更多的自定义注解。IFieldWiring.javaimportjava.lang.annotation.Annotation;importjava.lang.reflect.Field;publicinterfaceIFieldWiringClassannotationClass();voidwiring(Objectobject,Fieldfield);IFieldWiring.java的实现类-DataSourceWiring.java。(该类实现只为演示用,有很多地方是可以改进的)importjava.lang.annotation.Annotation;importjava.lang.reflect.Field;publicclassDataSourceWiringimplementsIFieldWiringOverridepublicvoidwiring(Objectobject,Fieldfield)ObjectfieldObj=ReflectUtils.getFieldValue(object,field.getName();/获得field对应的对象if(fieldObj!=null)return;DataSourceannotation=field.getAnnotation(DataSource.class);Stringtype=annotation.type();StringsqlMap=annotation.sqlMap();/这里可以用缓存来实现,不用每次都去创建新的SqlMapClient对象SqlMapClientsqlMapImpl=newSqlMapClient(sqlMap,type);/将生成SqlMapClient注入到bean对象的字段上ReflectUtils.setFieldValue(object,field.getName(),SqlMapClient.class,sqlMapImpl);OverridepublicClassannotationClass()returnDataSource.class;这里的ReflectUtils.java 也是我们自定义的,并非有Spring提供的:importjava.lang.reflect.Field;importjava.lang.reflect.Method;mons.lang.StringUtils;publicclassReflectUtils/*/*取得字段值*paramobj*paramfieldName*return*/publicstaticObjectgetFieldValue(Objectobj,StringfieldName)if(obj=null|fieldName=null|.equals(fieldName)returnnull;Classclazz=obj.getClass();tryStringmethodname=get+StringUtils.capitalize(fieldName);Methodmethod=clazz.getDeclaredMethod(methodname);method.setAccessible(true);returnmethod.invoke(obj);catch(Exceptione)tryFieldfield=clazz.getDeclaredField(fieldName);field.setAccessible(true);returnfield.get(obj);catch(Exceptione1)e1.printStackTrace();returnnull;publicstaticvoidsetFieldValue(Objecttarget,Stringfname,ClassfieldClass,ObjectfieldObj)if(!fieldClass.isAssignableFrom(fieldObj.getClass()return;Classclazz=target.getClass();tryMethodmethod=clazz.getDeclaredMethod(set+Character.toUpperCase(fname.charAt(0)+fname.substring(1),fieldClass);method.setAccessible(true);method.invoke(target,fieldObj);catch(Exceptione)tryFieldfield=clazz.getDeclaredField(fname);field.setAccessible(true);field.set(target,fieldObj);catch(Exceptione1)e1.printStackTrace();已经基本大功告成了,只要将我们的DataSourceWiring.java类使用起来即可。MyAnnotationBeanProcessor.java,这个类主要用于为bean对象注入资源。importjava.lang.reflect.Field;publicclassMyAnnotationBeanProcessor/*/*注入资源*paramserviceObject*paramfieldAutoWirings/所有实现IFieldWiring的接口的对象,我们可以在此扩展*throwsException*/publicvoidwire(ObjectserviceObject,IFieldWiringfieldAutoWirings)throwsExceptionClasscls=serviceObject.getClass();for(Fieldfield:cls.getDeclaredFields()for(IFieldWiringfieldAutoWiring:fieldAutoWirings)if(field.isAnnotationPresent(fieldAutoWiring.annotationClass()fieldAutoWiring.wiring(serviceObject,field);break;好了,开始我们的测试类:FieldWiringTest.javapublicclassFieldWiringTestpublicstaticvoidmain(Stringargs)throwsExceptionMyAnnotationBeanProcessorprocessor=newMyAnnotationBeanProcessor();MyServiceb=newMyService();processor.wire(b,newDataSourceWiring();/注入DataSource资源System.out.println(b.selectForObjectFromB(,null);System.out.println(b.selectForObjectFromA(,null);执行结果:SqlMapClientsqlMap=com/annotation/sql-map-c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宝马汽车销售基础培训
- 北师大版八年级数学下册【期末满分押题】夯实基础培优卷(轻松拿满分)(考试版)
- 发热病人中医护理
- 2024中铝国际贸易集团有限公司面向社会公开招聘人员13人笔试参考题库附带答案详解
- 七年级生物上册 2.4.1生物的分类方法教学设计 (新版)济南版
- 全国闽教版初中信息技术七年级上册第二单元第5课《电子表格数据的统计》教学设计
- 人教版初中历史与社会七年级上册 1.1 我的家在哪里 从社区看我家 教学设计
- 九年级化学上册 第五章 燃料 5.3 二氧化碳的性质和制法教学设计 (新版)粤教版
- 人教部编版八年级历史上册 第七单元 第24课 人民解放战争的胜利 教学设计
- 短期培训毕业交流会
- 洗涤机械生产过程质量控制考核试卷
- 2025年中国安防视频监控镜头市场竞争态势及投资方向研究报告
- 画龙点睛成语故事
- 电信行业用户欠费催收策略与措施
- 银行资格考试分析与策略试题及答案
- 多式联运风险管理与优化-全面剖析
- 2025年博士思政面试题及答案
- 湖北省武汉市七一华源中学2024-2025学年九年级下学期第二次月考化学试题(含答案)
- 专题12 将军饮马模型(解析版)
- 广东省深圳市深圳实验学校等校联考2024-2025学年九年级下学期开学考试语文试题(含答案)
- GB/T 25020.1-2025电气化铁路接触网支柱第1部分:钢支柱
评论
0/150
提交评论