本文原作者jfinal 社区大牛杜福忠,我因为感 觉有用搬一下:
功能需求:
这是一个泛型方法,接受一个 Record
对象和一个目标 Bean 的 Class
对象作为参数,返回一个转换后的 Bean 对象。
方法内部通过反射创建 Bean 的实例,然后遍历 Bean 的所有属性,从 Record
对象中获取相应的值并设置到 Bean 的属性中。
// 导入JFinal框架中的Record类,用于表示数据库记录 import com.jfinal.plugin.activerecord.Record; // 导入Java Beans API,用于获取Java Bean的属性信息 import java.beans.Introspector; import java.beans.PropertyDescriptor; // 导入Java反射API,用于动态创建对象 import java.lang.reflect.Constructor; // 导入Java集合框架中的ArrayList和List接口,用于处理列表数据 import java.util.ArrayList; import java.util.List; // 忽略未使用的警告 @SuppressWarnings("unused") public class RecordToBean { /** * 将单个Record对象转换为指定类型的Java Bean对象。 * * @param r 要转换的Record对象 * @param clazz 目标Java Bean的Class对象 * @param <T> 目标Java Bean的类型 * @return 转换后的Java Bean对象 */ public static <T> T to(Record r, Class<T> clazz) { try { // 使用反射创建目标Java Bean的实例 T ret = clazz.getDeclaredConstructor().newInstance(); // 获取目标Java Bean的所有属性描述符 PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors(); // 遍历所有属性,从Record对象中获取相应的值并设置到Java Bean的属性中 for (PropertyDescriptor pd : pds) { Object value = getValue(r, pd); pd.getWriteMethod().invoke(ret, value); } return ret; } catch (Exception e) { // 如果有任何异常,抛出一个RuntimeException throw new RuntimeException(e); } } /** * 将Record对象列表转换为指定类型的Java Bean对象列表。 * * @param list 要转换的Record对象列表 * @param clazz 目标Java Bean的Class对象 * @param <T> 目标Java Bean的类型 * @return 转换后的Java Bean对象列表 */ public static <T> List<T> to(List<Record> list, Class<T> clazz) { try { // 使用反射获取目标Java Bean的构造器 Constructor<T> constructor = clazz.getDeclaredConstructor(); // 获取目标Java Bean的所有属性描述符 PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors(); // 创建一个与Record列表大小相同的Java Bean列表 List<T> ret = new ArrayList<>(list.size()); // 遍历Record列表,对每个Record对象进行转换 for (Record r : list) { T obj = constructor.newInstance(); for (PropertyDescriptor pd : pds) { Object value = getValue(r, pd); pd.getWriteMethod().invoke(obj, value); } ret.add(obj); } return ret; } catch (Exception e) { // 如果有任何异常,抛出一个RuntimeException throw new RuntimeException(e); } } /** * 根据属性描述符从Record对象中获取属性值。 * * @param r 要获取值的Record对象 * @param pd 属性描述符,表示要获取的属性 * @return 属性值 */ private static Object getValue(Record r, PropertyDescriptor pd) { String key = pd.getName(); // 获取属性名 Class<?> type = pd.getPropertyType(); // 获取属性类型 // 根据属性类型从Record对象中获取相应的值 if (String.class.equals(type)) { return r.getStr(key); } else if (Integer.class.equals(type)) { return r.getInt(key); } else if (Boolean.class.equals(type)) { return r.getBoolean(key); } else if (java.math.BigDecimal.class.equals(type)) { return r.getBigDecimal(key); } else if (Long.class.equals(type)) { return r.getLong(key); } else if (java.math.BigInteger.class.equals(type)) { return r.getBigInteger(key); } else if (java.util.Date.class.equals(type)) { return r.getDate(key); } else if (Double.class.equals(type)) { return r.getDouble(key); } else if (Float.class.equals(type)) { return r.getFloat(key); } else if (java.time.LocalDateTime.class.equals(type)) { return r.getLocalDateTime(key); } else if (Short.class.equals(type)) { return r.getShort(key); } else if (Byte.class.equals(type)) { return r.getByte(key); } else if (Number.class.equals(type)) { return r.getNumber(key); } // 如果类型不匹配,则使用通用的get方法获取值 return r.get(key); } }
测试使用:
public static class MyBean{ private String a; public void setA(String a) { this.a = a; } private BigDecimal b; public void setB(BigDecimal b) { this.b = b; } //get... @Override public String toString() { return "MyBean{" + "a='" + a + '\'' + ", b=" + b + '}'; } } public static void main(String[] args) { Record r = new Record(); r.set("a", "A"); r.set("b", "888"); MyBean t = RecordToBean.to(r, MyBean.class); System.out.println(t); List<Record> list = new ArrayList<>(); list.add(r); list.add(r); List<MyBean> rs = RecordToBean.to(list, MyBean.class); System.out.println(rs); }
标签:return,List,JavaBea,Record,Bean,key,Java,class From: https://www.cnblogs.com/ZzwWan/p/18584525