Java:通过反射复制父类字段到子类。
有些时候需要建立子类继承于父类,尤其是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:通过反射复制父类字段到子类。的更多相关文章
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
- 构建后端第6篇之---java 多态的本质 父类引用 指向子类实现
张艳涛写于2021-2-20 今天来个破例了,不用英文写了,今天在家里电脑写的工具不行,简单的说 主题是:java多态的原理与实现 结论是:java的多态 Father father= new Son ...
- java通过反射获取bean字段注解@Column中的信息
直接上代码吧: Field field; Field[] fields=clas.getDeclaredFields(); for (int i = 0; i <fields.length ; ...
- Java 中父类怎么调用子类的方法?
父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...
- Java特性之多态父类与子类之间的调用
问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- Java父类对象调用子类实体:方法重写与动态调用
众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...
- java 子类强转父类 父类强转子类
Java 继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. Java 子类强转父类 父类引用指向子类对象: jav ...
随机推荐
- 【iCore3 双核心板_FPGA】实验二十六:SDRAM读写测试实验
实验指导书及代码包下载: http://pan.baidu.com/s/1c1VRibY iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 简单查询(select)
在数据库中,字符串进行运算时,会将字符串内容转化为数字进行运算 查询语法:select 列 from 表 where 条件 order by 排序 asc:升序 ...
- ios 中scrollview上面嵌套tableView,左右滑动出现数据多次刷新的问题
注意scrollView左右滑动时不要刷新数据,刚进来时一次性请求所有数据 红包纪录和房源信息可以左右滑动和点击,tableView可以上下滑动,图片部分个人信息只刷新一次. 界面布局如下
- jvisualVM 分析heapdump
代码很简单,eclipse里面设置下最大堆空间为128m,: @Test public void testOutOfMemory() { List<NewsAddDto> document ...
- Java_Map_Map详解
本博客为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/8867065 1.Map概述 Map<K,V> Map集 ...
- ASP.NET Web Api
1.参考资料 Routing in Asp.NET Web Api: http://www.asp.net/web-api/overview/web-api-routing-and-actions/r ...
- Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
转载自:http://blog.sina.com.cn/s/blog_701c951f0100n1sp.html 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题, ...
- 源码阅读 etherum-transactions.py
交易(transaction.py)的结构: fields = [ ('nonce', big_endian_int), ('gasprice', big_endian_int), ('startga ...
- Selenium2学习-040-JavaScript弹出框(alert、confirm、prompt)操作演示实例
弹出框是网页自动化测试常见得操作页面元素之一,常见的JavaScript弹出框有如下三种: 1.alert(message):方法用于显示带有一条指定消息和一个 OK 按钮的警告框.DemoAlert ...
- Quartz2D 编程指南(三)渐变、透明层 、数据管理
概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 渐变 简介 渐变是从一个颜色到另外 ...