spring自动注入的原理与实现

1.编写工具类BeanUtils,该类为核心类,这段代码是一个工具类,提供了一些静态方法来操作Java对象和Map。 接下来,有一个 `getBean` 方法,它接受一个 `Class` 类型的参数,并返回一个泛型对象。在方法内部,它使用反射来实例化一个对象,并返回该对象。 然后,有一个 `getMapArrayToString` 方法,它接受一个 `Map<String, String[]>` 类型的参数,并返回一个 `Map<String, String>` 类型的对象。该方法将遍历输入的 `map` 对象,将每个键值对中的字符串数组转换为以逗号分隔的字符串,并将结果存储在新的 `map1` 对象中。 接着,有一个重载的 `getBean` 方法,它接受一个 `Class` 类型和一个 `Map<String, String>` 类型的参数,并返回一个泛型对象。在方法内部,它使用反射实例化一个对象,并将 `map` 中的键值对应的属性值通过反射调用setter方法设置到对象中。 最后,有两个私有方法, `caseParam` 和 `getSetMethod` 。 `caseParam` 方法用于根据参数类型将字符串转换为对应的基本数据类型或 `String` 类型。 `getSetMethod` 方法用于获取指定属性名对应的setter方法。

package utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class BeanUtils {
    public BeanUtils() {
    }

    public static <T> T getBean(Class<T> c) {
        T t = null;

        try {
            t = c.getConstructor((Class[])null).newInstance();
            return t;
        } catch (InstantiationException var3) {
            throw new RuntimeException(var3);
        } catch (IllegalAccessException var4) {
            throw new RuntimeException(var4);
        } catch (InvocationTargetException var5) {
            throw new RuntimeException(var5);
        } catch (NoSuchMethodException var6) {
            throw new RuntimeException(var6);
        }
    }

    public static Map<String, String> getMapArrayToString(Map<String, String[]> map) {
        Map<String, String> map1 = new HashMap();
        Set<String> set = map.keySet();
        Iterator<String> it = set.iterator();

        while(it.hasNext()) {
            String key = (String)it.next();
            map1.put(key, String.join(",", (CharSequence[])map.get(key)));
        }

        return map1;
    }

    public static <T> T getBean(Class<T> objectClass, Map<String, String> map) {
        T t = null;

        try {
            t = objectClass.getConstructor((Class[])null).newInstance();
            Set<String> set = map.keySet();
            Iterator<String> it = set.iterator();

            while(it.hasNext()) {
                String key = (String)it.next();
                Method m = getSetMethod(key, objectClass);
                String param = (String)map.get(key);
                m.invoke(t, caseParam(param, m.getParameterTypes()[0]));
            }

            return t;
        } catch (InstantiationException var8) {
            throw new RuntimeException(var8);
        } catch (IllegalAccessException var9) {
            throw new RuntimeException(var9);
        } catch (InvocationTargetException var10) {
            throw new RuntimeException(var10);
        } catch (NoSuchMethodException var11) {
            throw new RuntimeException(var11);
        }
    }

    private static Object caseParam(String param, Class<?> c) {
        Object o = null;
        switch (c.getName()) {
            case "float":
                o = Float.parseFloat(param);
                break;
            case "double":
                o = Double.parseDouble(param);
                break;
            case "int":
                o = Integer.parseInt(param);
                break;
            case "short":
                o = Short.parseShort(param);
                break;
            case "byte":
                o = Byte.parseByte(param);
                break;
            case "long":
                o = Long.parseLong(param);
                break;
            case "boolean":
                o = Boolean.parseBoolean(param);
                break;
            case "java.lang.String":
                o = param;
                break;
            default:
                System.out.println("不是基础数据类型");
        }

        return o;
    }

    private static <T> Method getSetMethod(String key, Class<T> objectClass) {
        Method method = null;
        Method[] var3 = objectClass.getMethods();
        int var4 = var3.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            Method method0 = var3[var5];
            if (method0.getName().startsWith("set") && method0.getName().substring(3).toLowerCase().equals(key)) {
                method = method0;
            }
        }

        return method;
    }
}

2.编写Main,输入学生信息,调用BeanUtils类,完成注入

import java.util.HashMap;
import java.util.Map;
import utils.BeanUtils;

public class Main {
    public Main() {
    }

    public static void main(String[] args) {
        Map<String, String> map = new HashMap();
        map.put("id", "5");
        map.put("name", "老王");
        map.put("balance", "3.89");
        Student student = (Student) BeanUtils.getBean(Student.class, map);
        System.out.println(student);
    }
}

3.运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值