JAVA反射的基本应用

 

 

package com.shby.core.utils;

import javax.persistence.Column;
import javax.persistence.Table;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;

/**
 * @author: 李小龙
 * @description:JAVA开发
 * @created:2019/8/31
 * @modified by 李小龙 on 2019/8/31
 */
public class ReflectUtils {

    public static final String AND = " AND ";
    public static final String OC_EQUALS  =  " = ";

    /**
     * 获取范型类(CLASS)
     * @param index
     * @return
     * @throws Exception
     */
    public static Class getActualType(int index, Object obj) throws Exception {//获取范型类
//                        if(Modifier.isStatic(field[j].getModifiers())) {//static 修饰的不做查询
//                            continue;
//                        }
        Class[] cl = obj.getClass().getInterfaces();//代理类获取方式
        Class repository = null;
        if (null != cl && cl.length > 0) {
            repository = cl[0];
            Type[] genType = repository.getGenericInterfaces();
            Type[] params = ((ParameterizedType) genType[0]).getActualTypeArguments();

            if (index >= params.length || index < 0) {
                return Object.class;
            }
            if (!(params[index] instanceof Class)) {
                return Object.class;
            }
            return (Class) params[index];
        }
        return null;
    }

    /**
     * 获得JPA的查询条件
     * @param param
     * @param root
     * @param criteriaBuilder
     * @return
     */
    public static Predicate assemblyWhere(Object param, Root root, CriteriaBuilder criteriaBuilder) {
        Field[] field = param.getClass().getDeclaredFields(); // 获取实体类的所有属性,返回Field数组
        List<Predicate> predicatesList = new ArrayList<>();
        try {
            for (int j = 0; j < field.length; j++) { // 遍历所有属性
                String oriname = field[j].getName(); // 获取属性的名字
                String name = oriname.substring(0, 1).toUpperCase() + oriname.substring(1); // 将属性的首字符大写,方便构造get,set方法
                String type = field[j].getGenericType().toString(); // 获取属性的类型
                if(type.equals("class java.util.Date") && (name.endsWith("Start") || name.endsWith("End"))) {
                    oriname = oriname.substring(0,oriname.length()-5);
                }
                Path path = null;
                try {
                    path = root.get(oriname);
                } catch (IllegalArgumentException e) {
                    continue;
                }

                Predicate p1 = null;
                if (type.equals("class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
                    Method m = param.getClass().getMethod("get" + name);
                    String value = (String) m.invoke(param); // 调用getter方法获取属性值
                    if(null == value || value.isEmpty()) {
                        continue;
                    }
                    p1 = criteriaBuilder.greaterThan(
                            criteriaBuilder.function("locate",Integer.class, criteriaBuilder.literal(value), path),
                            criteriaBuilder.literal(0)
                    );
                } else if(type.equals("class java.util.Date")) {
                    Method m = param.getClass().getMethod("get" + name);
                    Date value = (Date) m.invoke(param); // 调用getter方法获取属性值
                    if(null == value) {
                        continue;
                    }
                    if(name.endsWith("Start")) {
                        p1 = criteriaBuilder.and(criteriaBuilder.greaterThanOrEqualTo(path, value));
                    } else if(name.endsWith("End")) {
                        p1 = criteriaBuilder.and(criteriaBuilder.lessThanOrEqualTo(path, value));
                    } else {
                        p1 = criteriaBuilder.and(criteriaBuilder.equal(path, value));
                    }
                } else {
                    Method m = param.getClass().getMethod("get" + name);
                    Object value = m.invoke(param); // 调用getter方法获取属性值
                    if(null == value) {
                        continue;
                    }
                    p1 = criteriaBuilder.and(criteriaBuilder.equal(path, value));
                }
                predicatesList.add(p1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]));
    }

    /**
     * 根据对象,计算WHERE
     * @param param
     * @return
     * @throws Exception
     */
    public static String assemblyWhere(Object param) throws Exception  {

        Field[] fields = param.getClass().getDeclaredFields(); // 获取实体类的所有属性,返回Field数组
        String where = " WHERE 1=1 ";
        for(Field field : fields) {
            String oriname = field.getName(); // 获取属性的名字
            String name = oriname.substring(0, 1).toUpperCase() + oriname.substring(1); // 将属性的首字符大写,方便构造get,set方法
            Method method = param.getClass().getMethod("get" + name);
            Object value = method.invoke(param); // 调用getter方法获取属性值
            if(null == value) {
                continue;
            }
            String coloumn = getColumnName(field);
            if(null == coloumn) {
                continue;
            }
            where += AND + coloumn+ OC_EQUALS + value;
        }
        return where;
    }

    /**
     * 获得JAVAbean和数据库 字段的对应关系
     * @param obj
     * @return
     */
    public static Map getColumnAndFieldRelation(Object obj) {
        Map<String, String> map = new LinkedHashMap();
        Field[] fields = obj.getClass().getDeclaredFields();
        for(Field field : fields) {
            map.put(field.getName(), getColumnName(field));
        }
        return map;
    }

    /**
     * 获取数据库字段名
     * @param field
     * @return
     */
    public static Column getColumn(Field field) {
        Annotation[] annotations = field.getAnnotations();
        for(Annotation annotation : annotations) {
            if(annotation instanceof javax.persistence.Column) {
                javax.persistence.Column column = (javax.persistence.Column)annotation;
                return column;
            }
        }
        return null;
    }

    /**
     * 获取数据库字段名
     * @param field
     * @return
     */
    public static String getColumnName(Field field) {
        Annotation[] annotations = field.getAnnotations();
        for(Annotation annotation : annotations) {
            if(annotation instanceof javax.persistence.Column) {
                javax.persistence.Column column = (javax.persistence.Column)annotation;
                return column.name();
            }
        }
        return null;
    }

    /**
     * 获取数据库字段名
     * @param field
     * @return
     */
    public static String getTableName(Object field) {
        Annotation[] annotations = field.getClass().getAnnotations();
        for(Annotation annotation : annotations) {
            if(annotation instanceof Table) {
                Table column = (Table)annotation;
                return column.name();
            }
        }
        return null;
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值