Java Annotation —— 注解实战

举报
福州司马懿 发表于 2021/11/19 00:14:48 2021/11/19
【摘要】         Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。这些都是使...

        Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。这些都是使用别人定义的注解,一般注解的使用都是在一些基础框架或者类库中来定义的,因此很少见过有人自己去写一个注解出来并使用在程序中。
一、注解的好处在于

       通过类似注释的方式,可以控制程序的一些行为,运行时的状态,可以为成员赋值,做配置信息等等,与常规编码思维大相径庭。只用别人定义好的注解是搞不懂这些问题的,要想真正知道注解内部的秘密,要自己定义注解,然后在程序中获取注解信息,拿到注解信息后,就可以为我所用了。
下面我简单演示下三类注解的用法:类注解、方法注解、字段(也称之域)注解的定义与适用,并看看如何获取注解的信息。

二、使用注意点

(1)自定义注解,注意注解的时空范围,简单说就是注解针对的目标(类、方法、字段),以及注解的时效(运行时、或者源码中有效)。
(2)要获取注解的信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法。
(3)获取了注解对象,就可以调用注解的方法来获取相对应的值了。为基础框架所用。
(4)当然,注解也可以没有定义成员,这样注解就成了一个标记符号了。

三、代码实战:

(1)AnnotationInterfaceFIELD.java


  
  1. package com.demo.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.FIELD)
  8. @Inherited
  9. @Documented
  10. public @interface AnnotationInterfaceFIELD {
  11. public String descriptionFIELD();
  12. }


  
  1. package com.demo.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.METHOD)
  8. @Inherited
  9. @Documented
  10. public @interface AnnotationInterfaceMETHOD {
  11. public String descriptionMETHOD();
  12. }


  
  1. package com.demo.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. //@Retention(value=RetentionPolicy.RUNTIME)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. @Target(ElementType.TYPE)
  9. //@Target({ElementType.FIELD, ElementType.METHOD})
  10. @Inherited
  11. @Documented
  12. public @interface AnnotationInterfaceTYPE {
  13. String name() default "bob";
  14. int age() default 24;
  15. }


  
  1. package com.demo.annotation;
  2. @AnnotationInterfaceTYPE(name="chy龙神的博客",age=24)
  3. public class AnnotationTestClass {
  4. @AnnotationInterfaceFIELD(descriptionFIELD="annotation private field")
  5. private String privateField;
  6. @AnnotationInterfaceFIELD(descriptionFIELD="annotation protected field")
  7. protected String protectedField;
  8. @AnnotationInterfaceFIELD(descriptionFIELD="annotation public field")
  9. public String publicField;
  10. @AnnotationInterfaceMETHOD(descriptionMETHOD="annotation private method")
  11. public void privateMethod() { }
  12. @AnnotationInterfaceMETHOD(descriptionMETHOD="annotation protected method")
  13. public void protectedMethod() { }
  14. @AnnotationInterfaceMETHOD(descriptionMETHOD="annotation public method")
  15. public void publicMethod() { }
  16. }


  
  1. package com.demo.annotation;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. public class AnnotationTestDemo {
  5. public static void main(String[] args) {
  6. AnnotationTestClass cls = new AnnotationTestClass();
  7. try {
  8. Class annotationCls = Class.forName("com.demo.annotation.AnnotationInterfaceTYPE");
  9. if(cls.getClass().isAnnotationPresent(annotationCls)) {
  10. System.out.println("\nAnnotation Type=====================");
  11. AnnotationInterfaceTYPE annotationType = cls.getClass().getAnnotation(AnnotationInterfaceTYPE.class);
  12. System.out.println("annotationType.name = " + annotationType.name());
  13. System.out.println("annotationType.name = " + annotationType.age());
  14. }
  15. } catch (ClassNotFoundException e) {
  16. e.printStackTrace();
  17. }
  18. System.out.println("\nAnnotation Field====================");
  19. //getField只能获取类的public字段
  20. Field[] fields = cls.getClass().getFields();
  21. System.out.println("1、getField"+"("+fields.length+")");
  22. dumpFields(fields);
  23. //getDeclaredField是可以获取一个类的所有字段
  24. Field[] declardFields = cls.getClass().getDeclaredFields();
  25. System.out.println("\n2、getDeclaredField"+"("+declardFields.length+")");
  26. dumpFields(declardFields);
  27. try {
  28. Field mField = cls.getClass().getDeclaredField("publicField");
  29. AnnotationInterfaceFIELD mAnnotationField = mField.getAnnotation(AnnotationInterfaceFIELD.class);
  30. System.out.println(mAnnotationField.descriptionFIELD());
  31. } catch (NoSuchFieldException e) {
  32. e.printStackTrace();
  33. }
  34. System.out.println("\nAnnotation Method===================");
  35. Method[] methods = cls.getClass().getMethods();
  36. System.out.println("1、getMethod"+"("+methods.length+")");
  37. dumpMethods(methods);
  38. Method[] declardMethods = cls.getClass().getDeclaredMethods();
  39. System.out.println("\n2、getDeclaredMethod"+"("+declardMethods.length+")");
  40. dumpMethods(declardMethods);
  41. try {
  42. Method mMethod = cls.getClass().getDeclaredMethod("publicMethod");
  43. AnnotationInterfaceMETHOD mAnnotatMethod = mMethod.getAnnotation(AnnotationInterfaceMETHOD.class);
  44. System.out.println(mAnnotatMethod.descriptionMETHOD());
  45. } catch (NoSuchMethodException e) {
  46. e.printStackTrace();
  47. } catch (SecurityException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. public static void dumpFields(Field[] fields) {
  52. for(int i=0;i<fields.length;i++) {
  53. System.out.println("("+i+")"+fields[i].getName());
  54. }
  55. }
  56. public static void dumpMethods(Method[] methods) {
  57. for(int i=0;i<methods.length;i++) {
  58. System.out.println("("+i+")"+methods[i].getName());
  59. }
  60. }
  61. }

        Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。这些都是使用别人定义的注解,一般注解的使用都是在一些基础框架或者类库中来定义的,因此很少见过有人自己去写一个注解出来并使用在程序中。
一、注解的好处在于

       通过类似注释的方式,可以控制程序的一些行为,运行时的状态,可以为成员赋值,做配置信息等等,与常规编码思维大相径庭。只用别人定义好的注解是搞不懂这些问题的,要想真正知道注解内部的秘密,要自己定义注解,然后在程序中获取注解信息,拿到注解信息后,就可以为我所用了。
下面我简单演示下三类注解的用法:类注解、方法注解、字段(也称之域)注解的定义与适用,并看看如何获取注解的信息。

二、使用注意点

(1)自定义注解,注意注解的时空范围,简单说就是注解针对的目标(类、方法、字段),以及注解的时效(运行时、或者源码中有效)。
(2)要获取注解的信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法。
(3)获取了注解对象,就可以调用注解的方法来获取相对应的值了。为基础框架所用。
(4)当然,注解也可以没有定义成员,这样注解就成了一个标记符号了。

三、代码实战:

(1)AnnotationInterfaceFIELD.java


  
  1. package com.demo.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.FIELD)
  8. @Inherited
  9. @Documented
  10. public @interface AnnotationInterfaceFIELD {
  11. public String descriptionFIELD();
  12. }


  
  1. package com.demo.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.METHOD)
  8. @Inherited
  9. @Documented
  10. public @interface AnnotationInterfaceMETHOD {
  11. public String descriptionMETHOD();
  12. }


  
  1. package com.demo.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. //@Retention(value=RetentionPolicy.RUNTIME)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. @Target(ElementType.TYPE)
  9. //@Target({ElementType.FIELD, ElementType.METHOD})
  10. @Inherited
  11. @Documented
  12. public @interface AnnotationInterfaceTYPE {
  13. String name() default "bob";
  14. int age() default 24;
  15. }


  
  1. package com.demo.annotation;
  2. @AnnotationInterfaceTYPE(name="chy龙神的博客",age=24)
  3. public class AnnotationTestClass {
  4. @AnnotationInterfaceFIELD(descriptionFIELD="annotation private field")
  5. private String privateField;
  6. @AnnotationInterfaceFIELD(descriptionFIELD="annotation protected field")
  7. protected String protectedField;
  8. @AnnotationInterfaceFIELD(descriptionFIELD="annotation public field")
  9. public String publicField;
  10. @AnnotationInterfaceMETHOD(descriptionMETHOD="annotation private method")
  11. public void privateMethod() { }
  12. @AnnotationInterfaceMETHOD(descriptionMETHOD="annotation protected method")
  13. public void protectedMethod() { }
  14. @AnnotationInterfaceMETHOD(descriptionMETHOD="annotation public method")
  15. public void publicMethod() { }
  16. }


  
  1. package com.demo.annotation;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. public class AnnotationTestDemo {
  5. public static void main(String[] args) {
  6. AnnotationTestClass cls = new AnnotationTestClass();
  7. try {
  8. Class annotationCls = Class.forName("com.demo.annotation.AnnotationInterfaceTYPE");
  9. if(cls.getClass().isAnnotationPresent(annotationCls)) {
  10. System.out.println("\nAnnotation Type=====================");
  11. AnnotationInterfaceTYPE annotationType = cls.getClass().getAnnotation(AnnotationInterfaceTYPE.class);
  12. System.out.println("annotationType.name = " + annotationType.name());
  13. System.out.println("annotationType.name = " + annotationType.age());
  14. }
  15. } catch (ClassNotFoundException e) {
  16. e.printStackTrace();
  17. }
  18. System.out.println("\nAnnotation Field====================");
  19. //getField只能获取类的public字段
  20. Field[] fields = cls.getClass().getFields();
  21. System.out.println("1、getField"+"("+fields.length+")");
  22. dumpFields(fields);
  23. //getDeclaredField是可以获取一个类的所有字段
  24. Field[] declardFields = cls.getClass().getDeclaredFields();
  25. System.out.println("\n2、getDeclaredField"+"("+declardFields.length+")");
  26. dumpFields(declardFields);
  27. try {
  28. Field mField = cls.getClass().getDeclaredField("publicField");
  29. AnnotationInterfaceFIELD mAnnotationField = mField.getAnnotation(AnnotationInterfaceFIELD.class);
  30. System.out.println(mAnnotationField.descriptionFIELD());
  31. } catch (NoSuchFieldException e) {
  32. e.printStackTrace();
  33. }
  34. System.out.println("\nAnnotation Method===================");
  35. Method[] methods = cls.getClass().getMethods();
  36. System.out.println("1、getMethod"+"("+methods.length+")");
  37. dumpMethods(methods);
  38. Method[] declardMethods = cls.getClass().getDeclaredMethods();
  39. System.out.println("\n2、getDeclaredMethod"+"("+declardMethods.length+")");
  40. dumpMethods(declardMethods);
  41. try {
  42. Method mMethod = cls.getClass().getDeclaredMethod("publicMethod");
  43. AnnotationInterfaceMETHOD mAnnotatMethod = mMethod.getAnnotation(AnnotationInterfaceMETHOD.class);
  44. System.out.println(mAnnotatMethod.descriptionMETHOD());
  45. } catch (NoSuchMethodException e) {
  46. e.printStackTrace();
  47. } catch (SecurityException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. public static void dumpFields(Field[] fields) {
  52. for(int i=0;i<fields.length;i++) {
  53. System.out.println("("+i+")"+fields[i].getName());
  54. }
  55. }
  56. public static void dumpMethods(Method[] methods) {
  57. for(int i=0;i<methods.length;i++) {
  58. System.out.println("("+i+")"+methods[i].getName());
  59. }
  60. }
  61. }

四、运行截图:

补充:个人感觉其实对于“class的注解”与“添加基类的共有方法”无异。

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/52093600

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。