有些时候需要建立子类继承于父类,尤其是java里面很多类是用mybatis generator生成的。通过父类构造子类,好像很麻烦,要逐个字段进行赋值(反正我没有找到其他好办法)。
想到用反射复制的方式来实现。通过研究,做到了。主要是用了fastjson里面的东西。估计已经有其他类库实现了这个功能,可惜我不知道,只能自己搞。
1 import java.beans.Statement; 2 import java.lang.reflect.Field; 3 import java.lang.reflect.Method; 4 import java.lang.reflect.Type; 5 import java.util.List; 6 7 import com.alibaba.fastjson.JSON; 8 import com.alibaba.fastjson.util.DeserializeBeanInfo; 9 import com.alibaba.fastjson.util.FieldInfo; 10 import com.alibaba.fastjson.util.TypeUtils; 11 12 /** 13 * Created by fenggqc on 2016/6/29. 14 */ 15 public class Copyer { 16 17 18 public static <B, S extends B> void Copy(B bo, S so) throws IllegalAccessException { 19 20 try { 21 Class bc = bo.getClass(); 22 if (bo == null || so == null) { 23 return; 24 } 25 26 27 DeserializeBeanInfo deserializeBeanInfo = DeserializeBeanInfo.computeSetters(so.getClass(), (Type) so.getClass()); 28 List<FieldInfo> getters = TypeUtils.computeGetters(bo.getClass(), null); 29 30 List<FieldInfo> setters = deserializeBeanInfo.getFieldList(); 31 Object v; 32 FieldInfo getterfield; 33 FieldInfo setterfidld; 34 35 for (int j = 0; j < getters.size(); j++) { 36 37 getterfield=getters.get(j); 38 for (int i = 0; i < setters.size(); i++) { 39 setterfidld=setters.get(i); 40 // System.out.println(setterfidld.getName()); 41 // System.out.println(getterfield.getName()); 42 43 if (setterfidld.getName().compareTo(getterfield.getName()) == 0) { 44 v = getterfield.getMethod().invoke(bo); 45 setterfidld.getMethod().invoke(so,v); 46 break; 47 } 48 49 } 50 } 51 } catch (Exception ex) { 52 System.out.println(ex.toString()); 53 } 54 55 56 } 57 58 59 }