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 ...
随机推荐
- 响应式Web设计 - 布局
可扩展的布局 有一种流体布局的概念在早起web兴起的时,就开始盛行了.它的概念是说页面会根据浏览器窗口的变化进行更改,网站可以通过维护一套代码,保质一致性的设计.我这里强调的可扩展的布局也是基于这个概 ...
- 清理session的案例
and OPNAME ='Sort Output'; and OPNAME ='Sort Output'; and OPNAME ='Sort Output' ); select 'alter sys ...
- php ajax请求和返回
define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); d ...
- LoadRunner - 001
lr_eval_string():函数的主要作用:返回脚本中的一个参数当前的值,返回值类型:char一般多用在调试脚本时输出参数的值.具体用法如下:lr_output_message("Th ...
- js正则匹配的一个日常应用
应用实例 1 /** 将段落中的 \n 转换为 <p></p>, 规范存储 */ 2 function formatParagraphForStore(val) { 3 var ...
- PHP中include引用导致不能再次相对引用文件的一个小问题
今天遇到一个问题:php,incldue_once引入多次文件,多层引用,所以,不同目录下的文件要使用一个文件得先确定目录,比如(下例是提取出来的精简例子,组织的有点乱乱的): /homepage/i ...
- 通过href简单实现单击a链接跳转到页面指定位置
在页面中点击a标签后,要使其跳到页面里面相应的地方,方法很简单,就是在a标签里面href中的内容和你要跳到这个区域的id同名即可,例如: <a href="#ppp" tar ...
- Python开发【十二章】:ORM sqlalchemy
一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...
- 分析App应用市场, App应用有哪些类型
随着移动互联网的流行,APP应用也是异常火爆,App应用市场就如破冰的泉水在我们的生活中到处渗透,对于App开发的的状况来分析,企业在寻找技术人员开发一款专业的App软件的时候,必须先了解用户的需求与 ...
- leetcode 204
题目描述: Description: Count the number of prime numbers less than a non-negative number, n. 解法一: 遍历从1-n ...