通过java反射初始化对象参数
2021/5/5 22:55:32
本文主要是介绍通过java反射初始化对象参数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java反射初始化参数
- java反射为各参数赋随机初始值
java反射为各参数赋随机初始值
import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.*; public class Initparam { // 初始化的list和array参数的个数 private static final int arrayNum = 3; public static void main(String[] args) throws Exception{ BizReq<Animal> bizReq = new BizReq<>(); setAllParameter(bizReq, Animal.class); System.out.println(bizReq); } private static <T> void setAllParameter(BizReq<T> bizReq, Class<T> clazz) throws Exception{ T t = clazz.getDeclaredConstructor().newInstance(); if(bizReq.getBody() == null){ // body为空时要先创建对象 bizReq.setBody(getInstance(clazz)); } // 设置各参数值 setParameter(bizReq.getClass(), bizReq); } /** * 给类中的属性赋值 * @param clazz 要赋值的类 * @param o 当前类的实体 * @throws Exception */ private static void setParameter(Class clazz, Object o) throws Exception{ Field[] declaredFields = clazz.getDeclaredFields(); for (Field field : declaredFields) { field.setAccessible(true); Object targetValue = field.get(o); /* 若该值已存在值,则不进行赋值*/ if(targetValue != null && StringUtils.isNotBlank(targetValue.toString())){ // 若该值为非自定义类型对象,则跳过,否则进行赋值(递归调用) Class targetClass = targetValue.getClass(); if(isCommonClass(targetValue)){ continue; } setParameter(targetClass, targetValue); } // 对该属性进行赋值 setNotBlankValue(clazz, field.getName(), o, null); } return; } /** * 对属性进行赋值 * @param clazz 要赋值的字段类型 * @param name 要赋值的字段名 * @param o 要赋值的字段实体 * @param defaultValue 要进行赋的值 * @throws Exception */ private static void setNotBlankValue(Class clazz, String name, Object o, Object defaultValue) throws Exception{ String setMethod = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); Field declaredField = clazz.getDeclaredField(name); // 属性的类型 Class<?> type = declaredField.getType(); // 如果是object类型,则直接跳过 if(type.isAssignableFrom(Object.class)){ return; } Object instanceValue = getInstance(type); Method method = clazz.getMethod(setMethod, type); // 若存在defaultValue,则赋值defaultValue if(defaultValue != null){ method.invoke(o, defaultValue); setSuperClassValue(clazz.getSuperclass(), o); return; } // 非自定义类型并且非list,则直接使用instanceValue赋值 if(isCommonClass(instanceValue) && (!(instanceValue instanceof List))){ method.invoke(o, instanceValue); setSuperClassValue(clazz.getSuperclass(), o); return; } // 处理list类型的值 if (instanceValue instanceof List) { // 当前集合的泛型类型 Type genericType = declaredField.getGenericType(); if (null == genericType) { throw new Exception("未获取到list的泛型类型"); } if (genericType instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) genericType; // 得到泛型里的class类型对象 Class<?> actualTypeArgument = (Class<?>) pt.getActualTypeArguments()[0]; Object actualType = getInstance(actualTypeArgument); //....actualType字段处理 method.invoke(o, set2list(actualType)); } setSuperClassValue(clazz.getSuperclass(), o); return; } // 如果以上常见类型都没有匹配上,则代表需要匹配自定义类型 if(true){ Field[] fields = type.getDeclaredFields(); Object childObject = getInstance(type); for (Field field : fields) { field.setAccessible(true); Object targetValue = field.get(childObject); if(targetValue != null && StringUtils.isNotBlank(targetValue.toString())){ // 若该值为非自定义类型对象,则跳过,否则进行赋值(递归调用) if(isCommonClass(targetValue)){ continue; } setParameter(targetValue.getClass(), targetValue); } // 给对象内部属性赋值 setNotBlankValue(type, field.getName(), childObject, null); setSuperClassValue(clazz.getSuperclass(), o); } // 对该对象整体赋值 setNotBlankValue(clazz, name, o, childObject); } } /** * 对list全量赋值 * @param t list中包含的对象 * @param <T> * @return * @throws Exception */ private static <T> List<T> set2list(T t) throws Exception{ List<T> list = new ArrayList<>(); if(isCommonClass(t) && (!(t instanceof List))){ for (int i = 0; i < arrayNum; i++) { list.add((T)getInstance(t.getClass())); } return list; } // 获取泛型内的各字段类型 Class<?> clazz = t.getClass(); Field[] field = clazz.getDeclaredFields(); // 插入三个值 for (int i = 0; i < arrayNum; i++) { for (int j = 0; j < field.length; j++) { String fieldName = field[j].getName(); setNotBlankValue(clazz, fieldName, t, null); } list.add(t); } return list; } /** * 为父类赋值 * @param clazz 父类 * @param o 实体 * @throws Exception */ private static void setSuperClassValue(Class clazz, Object o) throws Exception{ if(clazz != null){ setParameter(clazz, o); } } /** * 获取实例化值 * 和isCommonClass方法对应 * @param clazz 要实例化的类 * @param <T> 实例化的值 * @return * @throws Exception */ private static <T> T getInstance(Class<T> clazz) throws Exception{ // 父类isAssignableFrom子类,所以此处的判断作为相等判断 if(clazz.isAssignableFrom(Object.class)){ return (T) new Object(); } // 之所以用isAssignableFrom是因为一些class并没有无参构造 if(clazz.isAssignableFrom(String.class)){ return (T) UUID.randomUUID().toString(); } if(clazz.isAssignableFrom(int.class)){ return (T) (Integer)(new Random().nextInt(200000)); } if(clazz.isAssignableFrom(Integer.class)){ return (T) (Integer)(new Random().nextInt(200000)); } if(clazz.isAssignableFrom(Date.class)){ return (T) new Date(); } if(clazz.isAssignableFrom(boolean.class)){ return (T) (Boolean)true; } if(clazz.isAssignableFrom(Boolean.class)){ return (T) (Boolean)true; } if(clazz.isAssignableFrom(Double.class)){ return (T) (Double.valueOf(new Random().nextDouble())); } if(clazz.isAssignableFrom(Float.class)){ return (T) (Float.valueOf(new Random().nextFloat())); } if(clazz.isAssignableFrom(double.class)){ return (T) (Double.valueOf(new Random().nextDouble())); } if(clazz.isAssignableFrom(Long.class)){ return (T) (Long.valueOf(new Random().nextLong())); } if(clazz.isAssignableFrom(long.class)){ return (T) (Long.valueOf(new Random().nextLong())); } if(clazz.isAssignableFrom(float.class)){ return (T) (Float.valueOf(new Random().nextFloat())); } if(clazz.isAssignableFrom(BigDecimal.class)){ return (T) new BigDecimal(String.valueOf(new Random().nextInt(200000))); } if(clazz.isAssignableFrom(List.class)){ return (T) new ArrayList<>(); } if(clazz.isAssignableFrom(String[].class)){ String[] strs = new String[arrayNum]; for (int i = 0; i < arrayNum; i++) { strs[i] = UUID.randomUUID().toString(); } return (T) strs; } Object o = null; try { o = clazz.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) o; } /** * 判断该实体是否是日常类(即非自定义对象类) * 和getInstance方法对应 */ private static boolean isCommonClass(Object o) throws Exception{ // 父类isAssignableFrom子类 if(o.getClass().isAssignableFrom(Object.class)){ return true; } // 子类instanceof父类 if(o instanceof String || o instanceof String[] || o instanceof Integer || o instanceof Date || o instanceof Boolean || o instanceof Double || o instanceof Float || o instanceof Long || o instanceof BigDecimal || o instanceof List){ return true; } return false; } }
这篇关于通过java反射初始化对象参数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-25外企也半夜发布上线吗?
- 2024-05-24鸿蒙原生应用再新丁!芒果TV 入局鸿蒙
- 2024-05-22基本概念
- 2024-05-22检索数据
- 2024-05-22排序数据
- 2024-05-22基础过滤数据
- 2024-05-22通过逻辑操作符过滤数据
- 2024-05-22通过通配符过滤数据
- 2024-05-22字段的拼接与计算
- 2024-05-22聚合函数