工具类:PropertyReflect
获取主键类型 获取主键值getId 给主键赋值setIdimport com.awb.escachedb.common.utils.ExceptionStackTrace; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 反射调用实体类getId,setId方法 * 主键字段默认为id * @Author: szw * @Date: 2020/5/25 14:41 */ public class PropertyReflect { protected static final Logger LOGGER = LoggerFactory.getLogger(PropertyReflect.class); public static final String GET = "get"; public static final String SET = "set"; public static final String ID_NAME = "id"; /** * 获取主键类型 * @param bean Object * @return sbu */ public static String getIdProperty(Object bean){ try { Class<?> type = bean.getClass().getDeclaredField(ID_NAME).getType(); return type.getSimpleName(); } catch (NoSuchFieldException e) { e.printStackTrace(); return null; } } /** * 获取主键值 * @param bean 对象 * @return String */ public static String getId(Object bean){ try{ Class<? extends Object> tClass = bean.getClass(); //得到所有属性 Field[] field = tClass.getDeclaredFields(); // 整合出 getId() 属性这个方法 Method m = tClass.getMethod(GET + replaceFirst(getFirstName(field))); // 用这个整合出来的get方法,强转成自己需要的类型 // 成功通过 T 泛型对象取到具体对象的 id ! return (String)m.invoke(bean); }catch(Exception e){ LOGGER.info("getId Exception: "+ ExceptionStackTrace.printStackTrace(e)); return null; } } /** * 给主键赋值 * @param bean 实体 * @param id 主键值 * @return String */ public static String setId(Object bean, String id){ try{ Class<? extends Object> tClass = bean.getClass(); //得到所有属性 Field[] field = tClass.getDeclaredFields(); String methodName = SET + replaceFirst(getFirstName(field)); // 整合出 getId() 属性这个方法 Method method = tClass.getDeclaredMethod(methodName, tClass.getDeclaredField(ID_NAME).getType()); // 用这个整合出来的set方法 method.invoke(bean, new Object[]{id}); // 成功通过 T 泛型对象取到具体对象的 id ! return id; }catch(Exception e){ LOGGER.info("setId Exception: "+ ExceptionStackTrace.printStackTrace(e)); return null; } } /** * 根据属性在实体类中的位置获取属性名 * @param field 属性数组 * @param index 属性在实体类中的位置 * @return String */ private static String getNameByIndex(Field[] field, int index) { //设置可以访问私有变量 StringBuffer sbu = new StringBuffer(""); for (int i = 0; i < field.length; i++) { if (i != index) { continue; } field[i].setAccessible(true); //获取属性的名字 String name = field[i].getName(); if (!StringUtils.isEmpty(name)) { //将属性名字的首字母大写 name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()); sbu.append(name); break; } } return sbu.toString(); } /** * 根据属性在实体类中的名字获取属性名 * @param field 属性数组 * @param indexName 属性在实体类中的名字 * @return String */ private static String getNameByIndex(Field[] field, String indexName) { //设置可以访问私有变量 StringBuffer sbu = new StringBuffer(""); for (Field id:field) { id.setAccessible(true); //获取属性的名字 String name = id.getName(); if (!StringUtils.isEmpty(name) && org.apache.commons.lang.StringUtils.equals(name, indexName)) { //将属性名字的首字母大写 name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()); sbu.append(name); break; } } return sbu.toString(); } /** * 将属性名字的首字母大写 */ private static String replaceFirst(String name) { return name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()); } /** * 获取主键名 * 默认主键是 field[0] */ private static String getFirstName(Field[] field) { //设置可以访问私有变量 field[0].setAccessible(true); return field[0].getName(); } /** * 获取主键名 * 默认主键是 field[0] */ private static String getFirstName(Object bean) { Class<? extends Object> tClass = bean.getClass(); //得到所有属性 Field[] field = tClass.getDeclaredFields(); //设置可以访问私有变量 field[0].setAccessible(true); return field[0].getName(); } }
java反射调用实体类getId,setId方法
最新推荐文章于 2023-03-31 10:46:11 发布