`
zhengjiong
  • 浏览: 71405 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

反射练习-用反射实现拷贝对象

    博客分类:
  • Java
阅读更多

package com.zj.reflect;

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

/**
 * 功能:用反射实现拷贝对象
 * @author zhengjiong
 * time:2011-9-17 19:37:46
 */
public class ReflectTest4
{
	public static void main(String[] args) throws Exception
	{
		ReflectTest4 rf = new ReflectTest4();
		
		People p1 = new People("zhangsn", 15);
		
		//执行拷贝
		People p2 = (People)rf.copy(p1);
		
		System.out.println(p2.getName() + " , " + p2.getAge());
	}

	private Object copy(Object p1) throws Exception
	{
		Class<?> classType = p1.getClass();
		//获得所有属性
		Field[] fields = classType.getDeclaredFields();
		
		//获得People的实例
		Object p2 = classType.newInstance();
		
		for(int i = 0; i < fields.length; i++){
			String methodName = fields[i].getName();
			String firstLetter = methodName.substring(0, 1).toUpperCase();
			
			//获得set,get方法名
			String getMethodName = "get" + firstLetter + methodName.substring(1);
			String setMethodName = "set" + firstLetter + methodName.substring(1);
			
			//获得People类每个属性的set,get方法
			Method getMethod = classType.getMethod(getMethodName, new Class<?>[]{});
			Method setMethod = classType.getMethod(setMethodName, new Class<?>[]{fields[i].getType()});
			
			//调用p1对象的get方法获得值
			Object value = getMethod.invoke(p1, new Object[]{});
			//把获得的值传给p2的set方法
			setMethod.invoke(p2, new Object[]{value});
		}
		
		return p2;
	}
}

class People{
	private String name;
	private int age;
	
	public People(){}
	
	public People(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	
}
 
分享到:
评论

相关推荐

    302.300.JAVA基础教程_面向对象(中)-Object类综合练习(302).rar

    不过,这个方法在实际使用时需要特别注意,因为它只复制了对象的浅拷贝,对于包含复杂数据结构的对象,可能需要实现`Cloneable`接口并重写`clone()`方法来实现深拷贝。 5. `finalize()`方法:这是一个特殊的方法,...

    C++类和对象日期类练习源码

    这个“C++类和对象日期类练习源码”提供了实践这些概念的机会,特别是关注类的六个默认成员函数。让我们详细探讨一下这些知识点。 首先,类是C++中定义数据结构和相关操作的方式,可以看作是现实世界中的实体或概念...

    面向对象PPT山大

    面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它以对象作为程序设计的基本单元,将数据和操作数据的方法封装在一起,实现数据的隐藏和抽象。在山东大学的这组面向对象PPT讲义中...

    Java复习题(考试复习)

    - 动态代理:使用java.lang.reflect.Proxy和InvocationHandler实现动态代理。 10. **Java 8及以后的新特性**: - Lambda表达式:简化匿名内部类,提高代码简洁性。 - Stream API:提供一种函数式编程风格处理...

    java经典面试笔试题

    - 集合操作:理解add、remove、contains、clear等基本操作,以及集合的拷贝、合并和过滤等高级操作。 5. **多线程** - 线程创建:通过实现Runnable接口或继承Thread类来创建线程。 - 线程同步:理解synchronized...

    JavaScript最常用的55个经典技巧

    - 浅拷贝只复制对象的引用,深拷贝会创建新对象并复制所有层次的属性。 14. 事件与事件处理: - DOM事件模型,包括捕获阶段、目标阶段和冒泡阶段。 - `addEventListener` 和 `removeEventListener` 用于添加和...

    2022中高级Android程序员面试必备宝典.pdf,这是一份不错的文件

    - **内存管理**:了解深拷贝与浅拷贝,Error与Exception的区别,反射机制及其应用。 - **重写equals()和hashCode()**:确保对象比较的正确性。 - **IO流**:理解BIO、NIO、AIO的区别,以及Java泛型的类型擦除。 - **...

    java初级知识

    多态是指子类对象可以被当作父类对象使用,从而实现代码的复用和扩展。 **14. 引用变量类型转换** 在多态的情况下,可以进行向上转型和向下转型。向上转型是自动的,而向下转型需要显式转换。 #### 四、面向对象...

    flash 动漫设计 猪八戒照镜子PPT课件PPT学习教案.pptx

    7. **变形与翻转**:使用“修改”菜单下的“变形”功能,可以对对象进行水平翻转,实现猪八戒在镜中的反射效果。 8. **拷贝与粘贴**:Ctrl+C和Ctrl+Shift+V快捷键用于复制和原位置粘贴,方便在不同帧之间快速移动和...

    Java数组练习题(带答案).doc

    除了常规操作之外,Java还支持数组的高级特性,比如使用反射机制来动态操作数组,使用`clone()`方法复制数组,或是使用`Arrays`类提供的静态方法进行数组操作。`Arrays`类中的`sort()`、`binarySearch()`等方法让...

    photoshop各种常见效果图文教程.doc

    2. 之后会涉及更多的图层操作和滤镜应用,比如可能需要使用模糊、透明度调整等,来达到玻璃般的透明和反射效果。 这些只是Photoshop中的一小部分知识,实际上,Photoshop包含了众多工具、命令和技术,如图层蒙版、...

    校招Java工程师面试问题及答案(全)

    面试者需要理解Java的深拷贝和浅拷贝的区别,i++的线程安全实现机制,以及Java的异常体系。此外,还应该了解Java中的集合框架,例如ArrayList和LinkedList的区别,以及HashMap的线程不安全问题和ConcurrentHashMap。...

    深入解析Windows操作系统中文.part2.rar

    本书针对Windows Server 2003、Windows XP和Windows 2000做了全面更新,通过许多练习实验让你直接感受到Windows的内部行为。另外,本书还介绍了一些高级诊断技术,以便使你的系统运行得更加平稳和高效。无论你是开发...

    入门:我在学习golang时使用的完整文件回购

    这个压缩包"getting-GOod-master"很可能包含了各种示例代码、练习项目以及可能的学习笔记,旨在帮助新手逐步熟悉Go语言的基础和高级特性。 Go语言是由Google开发的一种静态类型的、编译型的、并发型且具有垃圾回收...

    LeetCode

    7. **反射(Reflection)**:虽然不推荐在常规编程中频繁使用,但在某些高级算法或测试场景下,反射可以提供额外的灵活性。 通过 LeetCode 上的 Go 实践,你可以不断提升对 Go 语言的理解和编程技巧,同时增强解决...

Global site tag (gtag.js) - Google Analytics