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;
}
}
分享到:
相关推荐
不过,这个方法在实际使用时需要特别注意,因为它只复制了对象的浅拷贝,对于包含复杂数据结构的对象,可能需要实现`Cloneable`接口并重写`clone()`方法来实现深拷贝。 5. `finalize()`方法:这是一个特殊的方法,...
这个“C++类和对象日期类练习源码”提供了实践这些概念的机会,特别是关注类的六个默认成员函数。让我们详细探讨一下这些知识点。 首先,类是C++中定义数据结构和相关操作的方式,可以看作是现实世界中的实体或概念...
面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它以对象作为程序设计的基本单元,将数据和操作数据的方法封装在一起,实现数据的隐藏和抽象。在山东大学的这组面向对象PPT讲义中...
- 动态代理:使用java.lang.reflect.Proxy和InvocationHandler实现动态代理。 10. **Java 8及以后的新特性**: - Lambda表达式:简化匿名内部类,提高代码简洁性。 - Stream API:提供一种函数式编程风格处理...
- 集合操作:理解add、remove、contains、clear等基本操作,以及集合的拷贝、合并和过滤等高级操作。 5. **多线程** - 线程创建:通过实现Runnable接口或继承Thread类来创建线程。 - 线程同步:理解synchronized...
- 浅拷贝只复制对象的引用,深拷贝会创建新对象并复制所有层次的属性。 14. 事件与事件处理: - DOM事件模型,包括捕获阶段、目标阶段和冒泡阶段。 - `addEventListener` 和 `removeEventListener` 用于添加和...
- **内存管理**:了解深拷贝与浅拷贝,Error与Exception的区别,反射机制及其应用。 - **重写equals()和hashCode()**:确保对象比较的正确性。 - **IO流**:理解BIO、NIO、AIO的区别,以及Java泛型的类型擦除。 - **...
多态是指子类对象可以被当作父类对象使用,从而实现代码的复用和扩展。 **14. 引用变量类型转换** 在多态的情况下,可以进行向上转型和向下转型。向上转型是自动的,而向下转型需要显式转换。 #### 四、面向对象...
7. **变形与翻转**:使用“修改”菜单下的“变形”功能,可以对对象进行水平翻转,实现猪八戒在镜中的反射效果。 8. **拷贝与粘贴**:Ctrl+C和Ctrl+Shift+V快捷键用于复制和原位置粘贴,方便在不同帧之间快速移动和...
2. 之后会涉及更多的图层操作和滤镜应用,比如可能需要使用模糊、透明度调整等,来达到玻璃般的透明和反射效果。 这些只是Photoshop中的一小部分知识,实际上,Photoshop包含了众多工具、命令和技术,如图层蒙版、...
面试者需要理解Java的深拷贝和浅拷贝的区别,i++的线程安全实现机制,以及Java的异常体系。此外,还应该了解Java中的集合框架,例如ArrayList和LinkedList的区别,以及HashMap的线程不安全问题和ConcurrentHashMap。...
本书针对Windows Server 2003、Windows XP和Windows 2000做了全面更新,通过许多练习实验让你直接感受到Windows的内部行为。另外,本书还介绍了一些高级诊断技术,以便使你的系统运行得更加平稳和高效。无论你是开发...
这个压缩包"getting-GOod-master"很可能包含了各种示例代码、练习项目以及可能的学习笔记,旨在帮助新手逐步熟悉Go语言的基础和高级特性。 Go语言是由Google开发的一种静态类型的、编译型的、并发型且具有垃圾回收...
7. **反射(Reflection)**:虽然不推荐在常规编程中频繁使用,但在某些高级算法或测试场景下,反射可以提供额外的灵活性。 通过 LeetCode 上的 Go 实践,你可以不断提升对 Go 语言的理解和编程技巧,同时增强解决...