反射+自定义注解,实现获取注解标记的属性 注解Annotation实现原理与自定义注解例子 https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

前端开发   发布日期:2025年05月31日   浏览次数:152

目标:通过自定义注解 @Ignore 注解,觉得是否读取指定类的属性。

自定义注解:基础详见  注解Annotation实现原理与自定义注解例子

 

运行结果:

  1. [main] INFO util.FruitInfoUtil - 水果的名字为:entity.Apple
  2. [main] INFO util.FruitInfoUtil - 水果的颜色为:RED
  3. [main] INFO util.FruitInfoUtil - 水果的供应商名称为:红富士供应商,供应商地址为:山西红富士产业园
  4. [main] INFO main.MainTest - ====================
  5. [main] INFO util.FieldsUtil - fieldName:fruitColor's ignore is null
  6. [main] INFO util.FieldsUtil - fieldName:fruitProvider's ignore is false
    [main] INFO  util.FieldsUtil  - fields:
  7. [main] INFO util.FieldsUtil - fruitColor
  8. [main] INFO util.FieldsUtil - fruitProvider
  9. [main] INFO util.FieldsUtil - END

 

  1. import java.lang.annotation.*;
  2. @Target(ElementType.FIELD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Documented
  5. public @interface FruitName {
  6. String value() default "";
  7. }

  

  1. import java.lang.annotation.*;
  2. @Target(ElementType.FIELD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Documented
  5. public @interface FruitColor {
  6. public enum Color {GREND, RED, BLUE}
  7. Color fruitColor() default Color.GREND;
  8. }

  

  1. import java.lang.annotation.*;
  2. @Target(ElementType.FIELD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Documented
  5. public @interface FruitProvider {
  6. int id() default -1;
  7. String name() default "";
  8. String addr() default "";
  9. }

  

  1. import java.lang.annotation.*;
  2. @Target(ElementType.FIELD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Documented
  5. public @interface Ignore {
  6. boolean ignore() default false;
  7. }

  

  1. import annotation.FruitColor;
  2. import annotation.FruitName;
  3. import annotation.FruitProvider;
  4. import annotation.Ignore;
  5. public class Apple {
  6. @FruitName("entity.Apple")
  7. @Ignore(ignore = true)
  8. String fruitName;
  9. @FruitColor(fruitColor = FruitColor.Color.RED)
  10. // @Ignore(ignore = true)
  11. String fruitColor;
  12. @FruitProvider(id = 1, name = "红富士供应商", addr = "山西红富士产业园")
  13. @Ignore
  14. String fruitProvider;
  15. public String getFruitName() {
  16. return fruitName;
  17. }
  18. public void setFruitName(String fruitName) {
  19. this.fruitName = fruitName;
  20. }
  21. public String getFruitColor() {
  22. return fruitColor;
  23. }
  24. public void setFruitColor(String fruitColor) {
  25. this.fruitColor = fruitColor;
  26. }
  27. public String getFruitProvider() {
  28. return fruitProvider;
  29. }
  30. public void setFruitProvider(String fruitProvider) {
  31. this.fruitProvider = fruitProvider;
  32. }
  33. public void getAppleName(){
  34. System.out.println("水果的名称为:苹果。");
  35. }
  36. }

  

  1. import annotation.FruitColor;
  2. import annotation.FruitName;
  3. import annotation.FruitProvider;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import java.lang.reflect.Field;
  7. public class FruitInfoUtil {
  8. final static Logger logger = LoggerFactory.getLogger(FruitInfoUtil.class);
  9. public static void getAnnotationInfo(Class clazz){
  10. Field[] fields = clazz.getDeclaredFields();
  11. for (Field field : fields) {
  12. if(field.isAnnotationPresent(FruitName.class)){
  13. FruitName fruitName = field.getAnnotation(FruitName.class);
  14. logger.info("水果的名字为:"+fruitName.value());
  15. }
  16. else if(field.isAnnotationPresent(FruitColor.class)) {
  17. FruitColor fruitColor = field.getAnnotation(FruitColor.class);
  18. logger.info("水果的颜色为:" + fruitColor.fruitColor());
  19. }
  20. else if(field.isAnnotationPresent(FruitProvider.class)){
  21. FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);
  22. logger.info("水果的供应商名称为:" + fruitProvider.name()+",供应商地址为:"+fruitProvider.addr());
  23. }
  24. }
  25. }
  26. }

  

  1. import annotation.Ignore;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.lang.reflect.Field;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class FieldsUtil {
  8. final static Logger logger = LoggerFactory.getLogger(FieldsUtil.class);
  9. /**
  10. * 本类的所有 Ignore = false的字段集合
  11. * @param clazz
  12. */
  13. public static void getOneSelfActiveFieldsUtil(Class clazz){
  14. Field[] fields = clazz.getDeclaredFields();
  15. List<String> fileNames = new ArrayList<>();
  16. for (Field field : fields){
  17. String fieldName = field.getName();
  18. Ignore ignoreField = field.getAnnotation(Ignore.class);
  19. if(field.isAnnotationPresent(Ignore.class) && !ignoreField.ignore()){
  20. fileNames.add(field.getName());
  21. logger.info("fieldName:"+fieldName+"'s ignore is false");
  22. }
  23. else if(!field.isAnnotationPresent(Ignore.class)){
  24. fileNames.add(field.getName());
  25. logger.info("fieldName:"+fieldName+"'s ignore is null");
  26. }
  27. }
  28. logger.info("fields:");
  29. if(fileNames != null && fileNames.size() > 0){
  30. // fileNames.stream().forEach(System.out::println);
  31. fileNames.stream().forEach(y -> {
  32. logger.info(y);
  33. });
  34. }else{
  35. logger.info("Size() == 0 ");
  36. }
  37. logger.info("END");
  38. }
  39. /**
  40. * 包括 父类的所有Ignore = false(默认值)的字段信息
  41. * @param clazz
  42. */
  43. public static List<Field> getAllActiveFieldsUtil(Class clazz){
  44. List<String> fileNames = new ArrayList<>();
  45. List<Field> fieldList = null;
  46. Field[] fields;
  47. do{
  48. fields = clazz.getDeclaredFields();
  49. if(fields != null && fields.length > 0){
  50. for (Field field : fields){
  51. String fieldName = field.getName();
  52. Ignore ignoreField = field.getAnnotation(Ignore.class);
  53. if(field.isAnnotationPresent(Ignore.class) && !ignoreField.ignore()){
  54. fileNames.add(field.getName());
  55. logger.info("fieldName:"+fieldName+"'s ignore is false");
  56. fieldList.add(field);
  57. }
  58. else if(!field.isAnnotationPresent(Ignore.class)){
  59. fileNames.add(field.getName());
  60. logger.info("fieldName:"+fieldName+"'s ignore is null");
  61. fieldList.add(field);
  62. }
  63. }
  64. if(fileNames != null && fileNames.size() > 0){
  65. fileNames.stream().forEach(System.out::println);
  66. }else{
  67. logger.info("Size() == 0 ");
  68. }
  69. logger.info("END");
  70. }
  71. clazz = clazz.getSuperclass();
  72. }while (clazz != Object.class && clazz != null);
  73. return fieldList;
  74. }
  75. }

  

  1. import entity.Apple;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import util.FieldsUtil;
  5. import util.FruitInfoUtil;
  6. public class MainTest {
  7. final static Logger logger = LoggerFactory.getLogger(MainTest.class);
  8. public static void main(String[] args) {
  9. FruitInfoUtil.getAnnotationInfo(Apple.class);
  10. logger.info("====================");
  11. FieldsUtil.getOneSelfActiveFieldsUtil(Apple.class);
  12. }
  13. }

  

参考资源:

https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

以上就是反射+自定义注解,实现获取注解标记的属性 注解Annotation实现原理与自定义注解例子 https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html的详细内容,更多关于反射+自定义注解,实现获取注解标记的属性 注解Annotation实现原理与自定义注解例子 https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html的资料请关注九品源码其它相关文章!