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;
}