自动创建对象的步骤: 1.创建实例对象 : 被创建的对象类中必须有默认的构造方法,否走会报错。
bean = class.NewInstance2.根据对象得到里面的属性:
Field[] fields = class.getDeclaredFields(); for(Field field : fields){ String fieldName = field.getName(); Class<?> type = field.getType(); String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); }3.把属性进行组装:用Integer类型举例
// 当为Integer类型的时候 if (type.getSimpleName().equals("Integer")) { // 确保传进来的不是空值 if (request.getParameter(fieldName) != null&&request.getParameter(fieldName)!="") { // 通过方法名,获得方法对象 // 参数 // name -- 方法的名称 // parameterTypes -- 参数数组 Method method = clazz.getDeclaredMethod(methodName, Integer.class); method.invoke(bean, Integer.parseInt(request.getParameter(fieldName))); } public class BeanUtil { public static void main(String[] args) { //Object bean = builder(Major.class, ); // System.out.println(bean); } public static Object builder(Class clazz , HttpServletRequest request) { // College.java 代码,图纸 // Class 根据图纸生产的模具,JVM生成模具 // Class clazz = Apple.class; Object bean = null; try { // clazz.newInstance 实例化对象,但是被实例化的对象必须有默认的构造方法。 bean = clazz.newInstance(); // clazz.getDeclaredFields 访问所有的字段。 // 得到所有的零件。每一个零件都是一个零件对象。 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println(field); String fieldName = field.getName(); // 属性的类型,零件的材质 Class<?> type = field.getType(); String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); // 组装,给产品装上零件,就是给对象设置属性。 if (type.getSimpleName().equals("Integer")) { if (request.getParameter(fieldName) != null&&request.getParameter(fieldName)!="") { // 通过方法名,获得方法对象 Method method = clazz.getDeclaredMethod(methodName, Integer.class); method.invoke(bean, Integer.parseInt(request.getParameter(fieldName))); } } else if (type.getSimpleName().equals("String")) { if (request.getParameter(fieldName) != null&&request.getParameter(fieldName)!="") { Method method = clazz.getDeclaredMethod(methodName, String.class); method.invoke(bean, request.getParameter(fieldName)); } } else if (type.getSimpleName().equals("Date")) { if (request.getParameter(fieldName) != null&&request.getParameter(fieldName)!="") { Method method = clazz.getDeclaredMethod(methodName, Date.class); String date = request.getParameter(fieldName); method.invoke(bean, DateUtil.getDate(date)); } } else { // 除了Integer和String之外的类型的属性的处理 // 尝试获取属性上的Nest注解 if (request.getParameter(fieldName) != null &&request.getParameter(fieldName)!="") { // 获取注解 Nest nest = field.getAnnotation(Nest.class); if (nest != null) { // 获得类 Class value = nest.value(); // 创建出对象 Object o = value.newInstance(); String mName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1) + "Id"; Method m = value.getDeclaredMethod(mName, Integer.class); m.invoke(o, Integer.parseInt(request.getParameter(fieldName))); Method method = clazz.getDeclaredMethod(methodName, value); method.invoke(bean, o); } } } } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return bean; } }Nest.java
@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Nest { /** * 使用Next注解注释属性时,指定属性的类型。 * @return */ Class value(); // 按生命周期来划分可分为3类: // 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃; // 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; // 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在; // @Target({ElementType.TYPE}) 注解 // ElementType 这个枚举类型的常量提供了一个简单的分类:注释可能出现在Java程序中的语法位置 //(这些常量与元注释类型(@Target)一起指定在何处写入注释的合法位置) }