+ Custom annotations reflection, achieve access attribute annotations Annotation annotation tag implementation principle example custom annotations

Objectives: custom annotation @Ignore notes, think whether attribute specifies the class to read.

 

operation result:

[main] INFO util.FruitInfoUtil - the name of the fruit is: entity.Apple 
[main] INFO util.FruitInfoUtil   - the color of the fruit is: RED 
[main] INFO util.FruitInfoUtil   - vendor name for the fruit: Fuji suppliers, supplier address: Shanxi Fuji industrial Park 
[main] INFO main.MainTest   - ==================== 
[main] INFO util.FieldsUtil   - fieldName: fruitColor's the ignore null IS 
[main] util.FieldsUtil the INFO - the fieldName: fruitProvider apos the ignore to false IS 
[main] util.FieldsUtil the INFO - Fields: [main] util.FieldsUtil the INFO - fruitColor [main] util.FieldsUtil the INFO - fruitProvider [main] the 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());
            }
            IF the else (field.isAnnotationPresent (FruitColor.class)) { 
                FruitColor fruitColor = field.getAnnotation (FruitColor.class); 
                logger.info ( "the color of the fruit is:" + fruitColor.fruitColor ()); 
            } 
            the else IF (Field. isAnnotationPresent (FruitProvider.class)) { 
                fruitProvider fruitProvider = field.getAnnotation (FruitProvider.class); 
                logger.info ( "fruit vendor name:" + fruitProvider.name () + " , supplier address:" + 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);
    }
}

  

Resources:

The principle of Annotation Annotation custom annotation examples

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

Guess you like

Origin www.cnblogs.com/bridgestone29-08/p/11096351.html