用父类对象给子类对象赋值数据

在写毕业设计的时候遇到了一些小问题,当创建一个VO类的时候,继承原先的PO类再添加新的属性比较快捷方便,但是将PO类转换成VO类就会需要先get再set所有属性。虽然说是面向ctrl+c、ctrl+v编程,但是还是想偷懒,所以有了以下代码:

/**
 * 将父类对象的属性值转储到子类对象中,仅限于get(is)方法set方法规范且并存,更适用于数据库实体类,不适用于功能性类
 * @param <T>
 * @param son 子类对象
 * @param father 父类对象
 * @throws Exception
 */
public static <T> void dump(T son, T father) throws Exception {
	//判断是否是子类
	if(son.getClass().getSuperclass() != father.getClass()) {
		throw new Exception("son is not subclass of father");
	}
	Class<? extends Object> fatherClass = father.getClass();
	//父类属性
	Field[] fatherFields = fatherClass.getDeclaredFields();
	//父类的方法
	Method[] fatherMethods = fatherClass.getDeclaredMethods();
	for (Field field : fatherFields) {
		StringBuilder sb = new StringBuilder(field.getName());
		//首字母转大写
		sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
		Method get = null, set = null;
		//遍历找属性get(is)方法和set方法
		for (Method method : fatherMethods) {
			if (method.getName().contains(sb)) {
				//get方法或is方法
				if(method.getParameterCount() == 0) {
					get = method;
				} else {//set方法
					set = method;
				}
			}
		}
		set.invoke(son, get.invoke(father));
	}
}

主要是通过反射来实现的,主要思路如下:

  1. 取父类的属性名称,首字符转大写。
  2. 遍历父类的方法,找到包含第一步属性名的方法。
  3. 根据方法参数个数判断是get还是set,boolean类型的属性的get方法是isXxxx这个没有什么关系。
  4. 进行方法调用,父类对象调get方法,子类对象调set方法。

PO类:对应数据库表的类,属性对应数据库表字段。

VO类:业务层之间用来传递数据的,可能和PO类属性相同,也可能多出几个属性。

原文地址:https://www.cnblogs.com/Vaxy/p/12670521.html

时间: 2024-10-08 02:42:35

用父类对象给子类对象赋值数据的相关文章

java父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

【转】父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

父类对象对子类对象方法的调用

1 import copy 2 class Dog: 3 def Eat(self): 4 print("Dog Eating...") 5 class Son: 6 def __init__(self): 7 self.height=100 8 def Eat(self): 9 print("Son Eating...") 10 class Father: 11 def LetSonEat(self,m): 12 if(isinstance(m,Son)): 13

父类引用指向子类对象

1 public class Test { 2 /** 3 * 对于多态,可以总结它为: 4 5 一.使用父类类型的引用指向子类的对象: 6 7 二.该引用只能调用父类中定义的方法和变量: 8 9 三.如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法:(动态连接.动态调用) 10 11 四.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错. 12 13 多态的3个必要条件: 14 15 1.继承 2.重写

理解父类引用指向子类对象

java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时:   Animal a = new Cat(); 这代表什么意思呢? 很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向C

关于父类引用指向子类对象

例如: 有以下2个类 public class Father { public int age = 70; public static string name = "父亲"; } public class Son : Father { public int age = 30; public static string name = "儿子"; } Father f=new Son(); 这种用法叫做“父类引用指向子类对象,或者叫“父类指针指向子类对象”,指的是定义一

java多态,如何理解父类引用指向子类对象

摘录 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时:   Animal a = new Cat(); 表示定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的. 那么这样做有什么意义呢?因为子类是对父类的一个改进

C#父类对象和子类对象之间的转化

1. 子类到父类 Chinese c = new Chinese(); Person p1 = c;  //从变量c看是一个中国人,所以可以把人的标签贴上去 2. 父类到子类 Chinese c2 = p1; //从变量p1看是一个人,不能随便把中国人的标签贴上去  不成功,必须显式转化如下,两种方式: (1)Chinese c2 = (Chinese)p1; (2)Chinese c2 =  p1 as Chinese; 上面两种方式的区别,看如下代码 p1 = new Japanese();

父类引用指向子类对象--面向对象的多态

先上代码 package com.fuzi.demo; public class FuZi { public static void main(String[] args) { FuLei fuLei = new ZiLei(); fuLei.print_info(); } } class FuLei { public void print_info() { System.out.println("父类的print_info"); System.out.println(this.get

JAVA基础复习与总结&lt;一&gt;(2) 父类引用指向子类对象(向上转型、动态链接)

public class Animal { public static void main(String[] args){ Animal animal = new Cat(); animal.voice(); drinkWater(animal); //调用静态方法,传入的是父类引用的子类对象 } String str; public void voice(){ System.out.println("普通动物叫声!"); } public static void drinkWater