目标:通过自定义注解 @Ignore 注解,觉得是否读取指定类的属性。
运行结果:
[main] INFO util.FruitInfoUtil - 水果的名字为:entity.Apple [main] INFO util.FruitInfoUtil - 水果的颜色为:RED [main] INFO util.FruitInfoUtil - 水果的供应商名称为:红富士供应商,供应商地址为:山西红富士产业园 [main] INFO main.MainTest - ==================== [main] INFO util.FieldsUtil - fieldName:fruitColor's ignore is null [main] INFO util.FieldsUtil - fieldName:fruitProvider's ignore is false
[main] INFO util.FieldsUtil - fields: [main] INFO util.FieldsUtil - fruitColor [main] INFO util.FieldsUtil - fruitProvider [main] INFO util.FieldsUtil - END
import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitName { String value() default ""; }
import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitColor { public enum Color {GREND, RED, BLUE} Color fruitColor() default Color.GREND; }
import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitProvider { int id() default -1; String name() default ""; String addr() default ""; }
import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Ignore { boolean ignore() default false; }
import annotation.FruitColor; import annotation.FruitName; import annotation.FruitProvider; import annotation.Ignore; public class Apple { @FruitName("entity.Apple") @Ignore(ignore = true) String fruitName; @FruitColor(fruitColor = FruitColor.Color.RED) // @Ignore(ignore = true) String fruitColor; @FruitProvider(id = 1, name = "红富士供应商", addr = "山西红富士产业园") @Ignore String fruitProvider; public String getFruitName() { return fruitName; } public void setFruitName(String fruitName) { this.fruitName = fruitName; } public String getFruitColor() { return fruitColor; } public void setFruitColor(String fruitColor) { this.fruitColor = fruitColor; } public String getFruitProvider() { return fruitProvider; } public void setFruitProvider(String fruitProvider) { this.fruitProvider = fruitProvider; } public void getAppleName(){ System.out.println("水果的名称为:苹果。"); } }
import annotation.FruitColor; import annotation.FruitName; import annotation.FruitProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; public class FruitInfoUtil { final static Logger logger = LoggerFactory.getLogger(FruitInfoUtil.class); public static void getAnnotationInfo(Class clazz){ Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if(field.isAnnotationPresent(FruitName.class)){ FruitName fruitName = field.getAnnotation(FruitName.class); logger.info("水果的名字为:"+fruitName.value()); } else if(field.isAnnotationPresent(FruitColor.class)) { FruitColor fruitColor = field.getAnnotation(FruitColor.class); logger.info("水果的颜色为:" + fruitColor.fruitColor()); } else if(field.isAnnotationPresent(FruitProvider.class)){ FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class); logger.info("水果的供应商名称为:" + fruitProvider.name()+",供应商地址为:"+fruitProvider.addr()); } } } }
import annotation.Ignore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class FieldsUtil { final static Logger logger = LoggerFactory.getLogger(FieldsUtil.class); /** * 本类的所有 Ignore = false的字段集合 * @param clazz */ public static void getOneSelfActiveFieldsUtil(Class clazz){ Field[] fields = clazz.getDeclaredFields(); List<String> fileNames = new ArrayList<>(); for (Field field : fields){ String fieldName = field.getName(); Ignore ignoreField = field.getAnnotation(Ignore.class); if(field.isAnnotationPresent(Ignore.class) && !ignoreField.ignore()){ fileNames.add(field.getName()); logger.info("fieldName:"+fieldName+"'s ignore is false"); } else if(!field.isAnnotationPresent(Ignore.class)){ fileNames.add(field.getName()); logger.info("fieldName:"+fieldName+"'s ignore is null"); } } logger.info("fields:"); if(fileNames != null && fileNames.size() > 0){ // fileNames.stream().forEach(System.out::println); fileNames.stream().forEach(y -> { logger.info(y); }); }else{ logger.info("Size() == 0 "); } logger.info("END"); } /** * 包括 父类的所有Ignore = false(默认值)的字段信息 * @param clazz */ public static List<Field> getAllActiveFieldsUtil(Class clazz){ List<String> fileNames = new ArrayList<>(); List<Field> fieldList = null; Field[] fields; do{ fields = clazz.getDeclaredFields(); if(fields != null && fields.length > 0){ for (Field field : fields){ String fieldName = field.getName(); Ignore ignoreField = field.getAnnotation(Ignore.class); if(field.isAnnotationPresent(Ignore.class) && !ignoreField.ignore()){ fileNames.add(field.getName()); logger.info("fieldName:"+fieldName+"'s ignore is false"); fieldList.add(field); } else if(!field.isAnnotationPresent(Ignore.class)){ fileNames.add(field.getName()); logger.info("fieldName:"+fieldName+"'s ignore is null"); fieldList.add(field); } } if(fileNames != null && fileNames.size() > 0){ fileNames.stream().forEach(System.out::println); }else{ logger.info("Size() == 0 "); } logger.info("END"); } clazz = clazz.getSuperclass(); }while (clazz != Object.class && clazz != null); return fieldList; } }
import entity.Apple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import util.FieldsUtil; import util.FruitInfoUtil; public class MainTest { final static Logger logger = LoggerFactory.getLogger(MainTest.class); public static void main(String[] args) { FruitInfoUtil.getAnnotationInfo(Apple.class); logger.info("===================="); FieldsUtil.getOneSelfActiveFieldsUtil(Apple.class); } }
参考资源: