`

反射-copy方法模拟

    博客分类:
  • Java
 
阅读更多
package com.unit;

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

public class ReflectTester {
	/**   
	     * 在这个类里面存在有copy()方法,根据指定的方法的参数去 构造一个新的对象的拷贝   
	     * 并将他返回   
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws SecurityException 
	 * @throws IllegalArgumentException */
		@SuppressWarnings({ "rawtypes", "unchecked" })
		public Object copy(Object obj) throws IllegalArgumentException, SecurityException, InstantiationException, 
			IllegalAccessException, InvocationTargetException, NoSuchMethodException{
			//获得对象的类型 
			Class classType=obj.getClass();
			System.out.println("该对象的类型是:"+classType.toString());
			//通过默认构造方法去创建一个新的对象,getConstructor的视其参数决定调用哪个构造方法
			Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
			//获得对象的所有属性 
			//[private java.lang.Long com.unit.Customer.id, private java.lang.String com.unit.Customer.name, private int com.unit.Customer.age]
			Field[] fields=classType.getDeclaredFields();
			for(int i=0 ; i < fields.length ; i++){
				Field field = fields[i];
				String fieldName = field.getName();
				String stringLetter = fieldName.substring(0,1).toUpperCase();
				//获得相应属性的getXXX和setXXX方法名称
				String getName = "get"+stringLetter+fieldName.substring(1);
				String setName = "set"+stringLetter+fieldName.substring(1);
				//获取相应的方法
				Method getMethod = classType.getMethod(getName,new Class[]{});
				Method setMethod = classType.getMethod(setName, new Class[]{field.getType()});
				//调用源对象的getXXX()方法 
				Object value = getMethod.invoke(obj, new Object[]{});
				System.out.println(fieldName+" :"+value); 
				//调用拷贝对象的setXXX()方法
				setMethod.invoke(objectCopy, new Object[]{value});
			}
			return objectCopy;
		}
		public static void main(String[] args) throws IllegalArgumentException, SecurityException, 
				InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
			Customer customer=new Customer();
			customer.setName("yc");
			customer.setId(new Long(1234));
			customer.setAge(19);
			Customer customer2=null;
			customer2=(Customer)new ReflectTester().copy(customer);
			System.out.println(customer.getName()+" "+customer2.getAge()+" "+customer2.getId());
			System.out.println(customer);
			System.out.println(customer2);
		}
		
}
class Customer{
	private Long	id;
	private String name;
	private int age;
	
	public Customer(){
		
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	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;
	}
}

 

分享到:
评论

相关推荐

    ideal---Copy.rar_matlab例程_matlab_

    标题中的"Ideal---Copy.rar_matlab例程_matlab_"表明这是一个与MATLAB相关的示例程序,可能是一个模拟或分析项目。描述中提到的"sar simulation in rda algorithm"揭示了这个压缩包的内容是关于合成孔径雷达(SAR)...

    Matlab NLOS通道实施与AWGN.zip

    压缩包中的两个“________ - Copy_1.doc”和“________ - Copy.doc”可能是详细步骤的文档,包含MATLAB代码示例和仿真过程的解释。而“H”可能是仿真结果的图形输出文件,可能显示了信号功率谱、信道特性或系统性能...

    reflection_copy.zip_in_reflection

    3. 利用`TerrainAltitudeTexture.skp` 模型来模拟地震波在真实地形中的传播和反射,这有助于预测地震数据的特征和解释地质构造。 总的来说,"reflection coefficient calculator in rocks" 这一主题涵盖了地震学、...

    copy_一维黎曼问题_

    在给出的“copy_一维黎曼问题”中,我们很可能是处理一个用Fortran编写的程序,用于模拟这种问题。 Fortran是一种古老的、但仍在科学计算中广泛使用的编程语言,以其高效的数值计算能力著称。在"copy.f90"这个文件...

    Matlab NLOS与AWGN.zip

    NLOS通信是指信号传输过程中不直接通过视线,而是经过反射、折射或散射的路径。AWGN则是通信系统中常见的噪声模型,用来模拟实际环境中的随机干扰。 在无线通信中,NLOS环境通常会导致信号衰减、多径传播和相位失真...

    C#常用函数和方法集汇总

    - `Task.FromResult()`: 返回一个已完成的任务,通常用于模拟异步操作。 9. **反射** - `Type`: 表示.NET类型的信息。 - `Activator.CreateInstance()`: 动态创建对象实例。 - `typeof()`: 获取类型对象。 - `...

    Go-Deepcopier-golang的简单结构复制

    在本文中,我们将深入探讨`Deepcopier`库的使用方法、原理以及它在实际开发中的应用场景。 首先,`Deepcopier`的核心功能是提供一种方式来复制包含嵌套结构的自定义类型。这包括基本类型、结构体、数组、切片、映射...

    基于STM32设计的便携式心电信号监测系统-序号146.zip

    (1)STM32采集心电信号传感器数据,心率传感器采用的是PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。 (2)LCD显示屏显示心电数字数据,和采集状态。 (3)HC05蓝牙传实时心电信号数据到手机APP。 ...

    C#水波程序(思路)

    首先创建一个Bitmap对象,表示我们的“水面”,然后通过LockBits和Marshal.Copy等方法直接访问像素数据。这样可以高效地更新大量像素,避免了频繁调用SetPixel函数带来的性能损耗。 代码实现中,可以定义一个...

    3Dmax翻译精华中的精华

    - **Diffuse()**:漫反射,设置材质的颜色和反射特性。 - **Specular(淴)**:高光,设置材质的高光特性。 - **ExtendedParameters(չ)**:扩展参数,提供更多的材质设置选项。 - **Bitmap(λͼ)**:位图,使用图像...

    python入门教程(非常详细),从零基础入门到精通,看完这一篇就够了.pdf

    * 基于 TCP 协议模拟 ssh 远程执行命令的 CS 架构软件 * 基于 UDP 协议套接字通信的实现 * 粘包现象与解决粘包问题 * 基于 socketserver 实现并发 socket 套接字编程 * 网络编程实战之 FTP 的文件断点续传 第十三章...

    linux图形系统开发基础,转帖自linux时代

    图形输出在嵌入式开发中,多数是向FrameBuffer中写数据,然后会显示在LCD中,在Linux下做图形开发的时候,需要模拟各种环境,比如16位色的环境,32位色的环境等,这个时候需要在Linux中做一个配置的修改: ...

    超声波检测,舵机控制的的pcb原理图

    首先,超声波检测是一种非接触式的测量方法,广泛应用于距离测量、液位检测、物体识别等多种场景。其原理是通过发射超声波脉冲,然后接收反射回来的信号,根据时间差计算目标的距离。在PCB设计中,通常会包含超声波...

    skyline模型标准及操作流程

    - **.FLT** - Multigen Creator格式,用于专业的模拟和训练领域。 - **.FPC** - .FLT格式模型文件的Skyline打包版本。 - **.DAE** - Sketchup格式Collada标准,广泛应用于3D内容的交换。 其中,**XPC** 和 **XPL2**...

    高质量音乐盘的制作

    - **使用EAC抓轨**:另一种方法是使用Exact Audio Copy (EAC) 软件直接从正版CD抓取音轨,设置正确即可实现无损抓轨。 #### 六、操作系统和软件选择 - **确保系统稳定**:保证操作系统没有病毒或其它问题,并定期...

    xss、脏牛提权.zip

    在给定的“xss注入闯关小游戏”中,我们可以深入理解这种攻击方式,通过模拟真实场景来学习如何防御和识别XSS攻击。 XSS攻击主要分为三种类型:存储型XSS、反射型XSS和DOM型XSS。存储型XSS是将恶意脚本存储在服务器...

    造个海洋球池来学习物理引擎【Three.js系列】.doc

    MeshStandardMaterial 是一种物理材质,可以处理光照反射,使物体看起来更真实。我们可以设定球体的颜色和金属度、粗糙度: ```javascript const sphereMaterial = new THREE.MeshStandardMaterial({ color: '#ff...

    java7源码-algorithmPractice:Java开发者的基础学习库,语言,数据结构,算法以及题解

    java7 源码 KnowledgePractice ...该部分答案多为本人刷题的题解,部分问题没有官方解答,所以贡献一份思路,并将最优解答Copy至此,便于向高手学习 题目描述请移步 数组 链表 字符串 哈希表 队列 15

    Chapter 18 Cube Mapping

    立方体贴图(Cube Mapping)是3D图形编程中一种重要的技术,主要应用于环境映射,为游戏和模拟应用提供高质量的反射、折射和全局光照效果。在DirectX12中,立方体贴图被广泛用于实现高效的环境光照计算,提高场景的...

    OFDMP16QAM.zip_通讯编程_matlab_

    而多径传播(MULTIPATH CHANNELS)是指信号在传播过程中因反射和折射产生的多个路径,导致信号到达接收端时产生干涉,形成多径衰落。 在压缩包内的三个MATLAB脚本文件中: 1. "Copy_of_unknown_16qam.m"可能是一个...

Global site tag (gtag.js) - Google Analytics