有些时候需要建立子类继承于父类,尤其是java里面很多类是用mybatis generator生成的。通过父类构造子类,好像很麻烦,要逐个字段进行赋值(反正我没有找到其他好办法)。

想到用反射复制的方式来实现。通过研究,做到了。主要是用了fastjson里面的东西。估计已经有其他类库实现了这个功能,可惜我不知道,只能自己搞。

  

 import java.beans.Statement;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.util.DeserializeBeanInfo;
import com.alibaba.fastjson.util.FieldInfo;
import com.alibaba.fastjson.util.TypeUtils; /**
* Created by fenggqc on 2016/6/29.
*/
public class Copyer { public static <B, S extends B> void Copy(B bo, S so) throws IllegalAccessException { try {
Class bc = bo.getClass();
if (bo == null || so == null) {
return;
} DeserializeBeanInfo deserializeBeanInfo = DeserializeBeanInfo.computeSetters(so.getClass(), (Type) so.getClass());
List<FieldInfo> getters = TypeUtils.computeGetters(bo.getClass(), null); List<FieldInfo> setters = deserializeBeanInfo.getFieldList();
Object v;
FieldInfo getterfield;
FieldInfo setterfidld; for (int j = 0; j < getters.size(); j++) { getterfield=getters.get(j);
for (int i = 0; i < setters.size(); i++) {
setterfidld=setters.get(i);
// System.out.println(setterfidld.getName());
// System.out.println(getterfield.getName()); if (setterfidld.getName().compareTo(getterfield.getName()) == 0) {
v = getterfield.getMethod().invoke(bo);
setterfidld.getMethod().invoke(so,v);
break;
} }
}
} catch (Exception ex) {
System.out.println(ex.toString());
} } }
 public class SubClass extends  BaseClass {

     private Date birthday;

     public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
} public class BaseClass { private Integer i;
private Boolean b; private Boolean is;
private Boolean isa; private String whatname; public Boolean getB() {
return b;
} public void setB(Boolean b) {
this.b = b;
} public Integer getI() {
return i;
} public void setI(Integer i) {
this.i = i;
} public Boolean getIs() {
return is;
} public void setIs(Boolean is) {
this.is = is;
} public Boolean getIsa() {
return isa;
} public void setIsa(Boolean isa) {
this.isa = isa;
} public String getWhatname() {
return whatname;
} public void setWhatname(String whatname) {
this.whatname = whatname;
}
}

测试了一下性能:

    @Test
public void Test() throws InvocationTargetException, IllegalAccessException { BaseClass baseClass = new BaseClass();
SubClass subClass=new SubClass(); baseClass.setB(true);
baseClass.setI(1010);
baseClass.setIs(false);
baseClass.setWhatname("fgq"); Integer i=0;
List<Integer> ii=new ArrayList<Integer>();
ii.add(1);
ii.add(10);
ii.add(100);
ii.add(1000);
ii.add(10000); StopWatch stopWatch=new StopWatch(); stopWatch.reset();;
stopWatch.start();
Copyer.Copy(baseClass, subClass);
stopWatch.stop();
System.out.println("cache the reflection:"+String.valueOf(stopWatch.getTime())); for (int j = 0; j < ii.size(); j++) {
i=0;
stopWatch.reset();;
stopWatch.start();
while ( i<ii.get(j)) { Copyer.Copy(baseClass, subClass);
subClass.setBirthday(new Date());
i+=1;
}
stopWatch.stop();
System.out.println(String.format("%s %s",ii.get(j),String.valueOf(stopWatch.getTime())));
} System.out.println(JSON.toJSONString(subClass,SerializerFeature.PrettyFormat,SerializerFeature.UseISO8601DateFormat)); }

性能结果为:

cache the reflection:120
1 1
10 7
100 53
1000 139
10000 634

感觉还行。呵呵

Java:通过反射复制父类字段到子类。的更多相关文章

  1. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

  2. 构建后端第6篇之---java 多态的本质 父类引用 指向子类实现

    张艳涛写于2021-2-20 今天来个破例了,不用英文写了,今天在家里电脑写的工具不行,简单的说 主题是:java多态的原理与实现 结论是:java的多态 Father father= new Son ...

  3. java通过反射获取bean字段注解@Column中的信息

    直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...

  4. Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  5. Java特性之多态父类与子类之间的调用

    问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...

  6. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  7. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  8. Java父类对象调用子类实体:方法重写与动态调用

    众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...

  9. java 子类强转父类 父类强转子类

    Java 继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. Java 子类强转父类 父类引用指向子类对象: jav ...

随机推荐

  1. 响应式Web设计 - 布局

    可扩展的布局 有一种流体布局的概念在早起web兴起的时,就开始盛行了.它的概念是说页面会根据浏览器窗口的变化进行更改,网站可以通过维护一套代码,保质一致性的设计.我这里强调的可扩展的布局也是基于这个概 ...

  2. 清理session的案例

    and OPNAME ='Sort Output'; and OPNAME ='Sort Output'; and OPNAME ='Sort Output' ); select 'alter sys ...

  3. php ajax请求和返回

    define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); d ...

  4. LoadRunner - 001

    lr_eval_string():函数的主要作用:返回脚本中的一个参数当前的值,返回值类型:char一般多用在调试脚本时输出参数的值.具体用法如下:lr_output_message("Th ...

  5. js正则匹配的一个日常应用

    应用实例 1 /** 将段落中的 \n 转换为 <p></p>, 规范存储 */ 2 function formatParagraphForStore(val) { 3 var ...

  6. PHP中include引用导致不能再次相对引用文件的一个小问题

    今天遇到一个问题:php,incldue_once引入多次文件,多层引用,所以,不同目录下的文件要使用一个文件得先确定目录,比如(下例是提取出来的精简例子,组织的有点乱乱的): /homepage/i ...

  7. 通过href简单实现单击a链接跳转到页面指定位置

    在页面中点击a标签后,要使其跳到页面里面相应的地方,方法很简单,就是在a标签里面href中的内容和你要跳到这个区域的id同名即可,例如: <a href="#ppp" tar ...

  8. Python开发【十二章】:ORM sqlalchemy

    一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...

  9. 分析App应用市场, App应用有哪些类型

    随着移动互联网的流行,APP应用也是异常火爆,App应用市场就如破冰的泉水在我们的生活中到处渗透,对于App开发的的状况来分析,企业在寻找技术人员开发一款专业的App软件的时候,必须先了解用户的需求与 ...

  10. leetcode 204

    题目描述: Description: Count the number of prime numbers less than a non-negative number, n. 解法一: 遍历从1-n ...