java 对象的成员变量赋值兼任类型, (若有泛型也兼容类型)

在学Spring 依赖注入 通过 注解@Autowired 可以自动执行字段, 方法等. 很好奇那字段是如何兼容类型赋值的, 而且自动泛型注入(判断)    

功能没有做完, 做的也很笼统, 希望指教。 

    /*
     *  给 o1.field 赋值为 o2
     */
    public static boolean cast(Object source, Field field, Object value) {
        
        Class class1 = source.getClass();
        Class class2 = value.getClass();
        boolean can = false;
        
        // 如果相同class 直接赋值    因为没法判断泛型类型
        if(field.getType() == value.getClass())
            can = true;
        
        // 如果为子类 只能作用于 父亲-儿子  不能作用于爷爷-孙子(跨一层)
        else if(field.getType().isInstance(value)) {
            

            // 两个传入的对象,  父亲泛型参数个数的比较
            int len1 = class1.getSuperclass().getTypeParameters().length;
            int len2 = class2.getSuperclass().getTypeParameters().length;
            if(len1 == 0) can = true;
            if(len1 == len2) {
                ParameterizedType p1 = (ParameterizedType)class1.getGenericSuperclass();
                ParameterizedType p2 = (ParameterizedType)class2.getGenericSuperclass();
                Type[] t1 = p1.getActualTypeArguments();
                Type[] t2 = p2.getActualTypeArguments();
                can = true;

                // 此处比较 泛型中class对象是否兼容
                for(int i = 0; i<t1.length; i++) {
                    System.out.println("i: ->>>>>>"+ t1[i]+" "+ t2[i]+ " "+ (t1==t2));
                    if(((Class)t1[i]).isAssignableFrom((Class)t2[i])){
                        can = false;
                        break;
                    }
                }
            }
        }
        if(can) {
            
            try {
                field.setAccessible(true);
                field.set(source, value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return can;
    }

猜你喜欢

转载自blog.csdn.net/qq_38598257/article/details/84325698