⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 copyutil.java

📁 通过JAVA的反射机制实现对象属性的拷贝
💻 JAVA
字号:
package com.softeem.j2se.lesson4;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class CopyUtil {

	// public static Student copy(Student stu){
	// Student stu2 = new Student();
	// stu2.setNo(stu.getNo());
	// stu2.setName(stu.getName());
	// stu2.setAge(stu.getAge());
	// return stu2;
	// }
	//	
	// public static Teacher copy(Teacher tea){
	// Teacher tea2 = new Teacher();
	// tea2.setName(tea.getName());
	// tea2.setSex(tea.getSex());
	// tea2.setTechaerAge(tea.getTechaerAge());
	// return tea2;
	// }

	/**
	 * 拷贝Javabean风格的对象
	 * @param obj
	 * @return
	 */
	public static Object copy(Object obj) {
		//获得某个对象的Class类型对象,Class对象是整个反射机制的源头和灵魂!
	    //Class对象是在类加载的时候产生,保存着类的相关属性、构造器、方法等信息
		Class clz = obj.getClass();
		Object objCopy = null;
		try {
			//得到Class对象所表征的类的一个实例
			objCopy = clz.newInstance();
			//得到Class对象所表征的类的所有属性(包括私有属性)
			Field[] fields = clz.getDeclaredFields();
			for (int i = 0; i < fields.length; i++) {
				//得到属性的名字
				String fieldName = fields[i].getName();
				//由属性名字得到对应get和set方法的名字
				String getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
				String setMethodName = "set"+ fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
				//由方法的名字得到get和set方法的Method对象
				Method getMethod = clz.getDeclaredMethod(getMethodName,new Class[]{});
				Method setMethod = clz.getDeclaredMethod(setMethodName,fields[i].getType());
				//调用obj对象的getMethod方法
				Object result = getMethod.invoke(obj, new Object[]{});
				//调用obj对象的setMethod方法
				setMethod.invoke(objCopy, result);
			}
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return objCopy;
	}

	public static void main(String[] args) {
		Student stu = new Student(100, "Mything", 21);
		Student stu2 = (Student) CopyUtil.copy(stu);
		System.out.println(stu2.getNo()+" "+stu2.getName()+" "+stu2.getAge());
		// System.out.println(stu2.getName());
//		Teacher tea = new Teacher("xuliang", '男', 10);
//		Teacher tea2 = (Teacher) CopyUtil.copy(tea);
		// System.out.println(tea2.getName());
		// Student stuCopy = CopyUtil.copy(stu);
		// System.out.println(stu==stuCopy);
		// System.out.println(stu.equals(stuCopy));
		// Teacher teaCopy = CopyUtil.copy(tea);
		// System.out.println(tea==teaCopy);
		// System.out.println(tea.equals(teaCopy));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -