All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mybatis.jpa.util.FieldReflectUtil Maven / Gradle / Ivy

package com.mybatis.jpa.util;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * @author svili
 */
public class FieldReflectUtil {

    /**
     * Set the field value to target object.
     *
     * @param target obj
     * @param name   field name
     * @throws Exception IllegalArgumentException, IllegalAccessException
     */
    public static  void setFieldValue(T target, String name, Object value) throws Exception {
        if (target == null) {
            throw new IllegalArgumentException("Target must not be null");
        }

        Field field = findField(target.getClass(), name);

        makeAccessible(field);

        field.set(target, value);
    }

    /**
     * Get the field value from target object.
     *
     * @param target obj
     * @param name   field name
     * @return value
     * @throws Exception IllegalArgumentException, IllegalAccessException
     */
    public static  Object getFieldValue(T target, String name) throws Exception {
        if (target == null) {
            throw new IllegalArgumentException("Target must not be null");
        }

        Field field = findField(target.getClass(), name);

        if (field == null) {
            throw new IllegalArgumentException("Can not find field " + name + " from " + target.getClass());
        }

        makeAccessible(field);

        return field.get(target);
    }

    /**
     * Attempt to find a field on the supplied Class with the
     * supplied {@code annotationType}. Searches all superclasses up to Object.
     *
     * @param clazz          the class to introspect
     * @param annotationType the annotation type of the field
     * @return Field or null
     */
    public static List findFields(Class clazz, Class annotationType) {
        List list = new ArrayList<>();
        Class searchType = clazz;
        while (!Object.class.equals(searchType) && searchType != null) {
            Field[] fields = searchType.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(annotationType)) {
                    list.add(field);
                }
            }
            searchType = searchType.getSuperclass();
        }
        return list;
    }

    /**
     * copy from org.springframework.util.ReflectionUtils
     */
    public static Field findField(Class clazz, String name) {
        return findField(clazz, name, null);
    }

    /**
     * copy from org.springframework.util.ReflectionUtils
     */
    public static Field findField(Class clazz, String name, Class type) {
        if (clazz == null) {
            throw new IllegalArgumentException("Class must not be null");
        }
        if (name == null && type == null) {
            throw new IllegalArgumentException("Either name or type of the field must be specified");
        }
        Class searchType = clazz;
        while (Object.class != searchType && searchType != null) {
            Field[] fields = searchType.getDeclaredFields();
            for (Field field : fields) {
                if ((name == null || name.equals(field.getName())) &&
                        (type == null || type.equals(field.getType()))) {
                    return field;
                }
            }
            searchType = searchType.getSuperclass();
        }
        return null;
    }

    /**
     * copy from org.springframework.util.ReflectionUtils
     */
    public static void makeAccessible(Field field) {
        if ((!Modifier.isPublic(field.getModifiers()) ||
                !Modifier.isPublic(field.getDeclaringClass().getModifiers()) ||
                Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
            field.setAccessible(true);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy