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

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

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

/*

*  给 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; iSystem.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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值