/** * Copyright (c) 2011-2020, hubin (jobob@qq.com). *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.baomidou.mybatisplus.toolkit; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import com.baomidou.mybatisplus.entity.TableFieldInfo; import com.baomidou.mybatisplus.entity.TableInfo; import com.baomidou.mybatisplus.enums.FieldStrategy; /** *

* 反射工具类 *

* * @author Caratacus * @Date 2016-09-22 */ public class ReflectionKit { private static final Log logger = LogFactory.getLog(ReflectionKit.class); /** *

* 反射 method 方法名,例如 getId *

* * @param str * 属性字符串内容 * @return */ public static String getMethodCapitalize(final String str) { return StringUtils.concatCapitalize("get", str); } /** * 获取 public get方法的值 * * @param cls * @param entity * 实体 * @param str * 属性字符串内容 * @return Object */ public static Object getMethodValue(Class cls, Object entity, String str) { Object obj = null; try { Method method = cls.getMethod(getMethodCapitalize(str)); obj = method.invoke(entity); } catch (NoSuchMethodException e) { logger.warn(String.format("Warn: No such method. in %s. Cause:", cls.getSimpleName()) + e); } catch (IllegalAccessException e) { logger.warn(String.format("Warn: Cannot execute a private method. in %s. Cause:", cls.getSimpleName()) + e); } catch (InvocationTargetException e) { logger.warn("Warn: Unexpected exception on getMethodValue. Cause:" + e); } return obj; } /** * 获取 public get方法的值 * * @param entity * 实体 * @param str * 属性字符串内容 * @return Object */ public static Object getMethodValue(Object entity, String str) { if (null == entity) { return null; } return getMethodValue(entity.getClass(), entity, str); } /** * 调用对象的get方法检查对象所有属性是否为null * * @param bean * 检查对象 * @return boolean true对象所有属性不为null,false对象所有属性为null */ public static boolean checkFieldValueNotNull(Object bean) { if (null == bean) { return false; } Class cls = bean.getClass(); TableInfo tableInfo = TableInfoHelper.getTableInfo(cls); if (null == tableInfo) { logger.warn("Warn: Could not find @TableId."); return false; } boolean result = false; List fieldList = tableInfo.getFieldList(); for (TableFieldInfo tableFieldInfo : fieldList) { FieldStrategy fieldStrategy = tableFieldInfo.getFieldStrategy(); Object val = getMethodValue(cls, bean, tableFieldInfo.getProperty()); if (FieldStrategy.NOT_EMPTY.equals(fieldStrategy)) { if (StringUtils.checkValNotNull(val)) { result = true; break; } } else { if (null != val) { result = true; break; } } } return result; } /** * 反射对象获取泛型 * * @param clazz * 对象 * @param index * 泛型所在位置 * @return Class */ @SuppressWarnings("rawtypes") public static Class getSuperClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { logger.warn(String.format("Warn: %s's superclass not ParameterizedType", clazz.getSimpleName())); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { logger.warn(String.format("Warn: Index: %s, Size of %s's Parameterized Type: %s .", index, clazz.getSimpleName(), params.length)); return Object.class; } if (!(params[index] instanceof Class)) { logger.warn(String.format("Warn: %s not set the actual class on superclass generic parameter", clazz.getSimpleName())); return Object.class; } return (Class) params[index]; } }