JAva反射学習四

4330 ワード

この部分からjava反射の実際の運用を学び、いくつかの大規模なデータベースに関連するプロジェクトではjavaの反射がよく使われています.例えば、以前やった保険プロジェクトでは、座席に電話がかかってきて記録操作を行い、最後に記録が完了したら保存をクリックすると、ページに入力されたデータをデータベースの一連のテーブルに保存します.この一連の表をひとまずTで表す.その後、清算システムはT表のデータをJMSを通じて相応の支社に清算し、それから支社は費用を支払う操作を行い、費用を払うことに成功した後、支社の清算プログラムはまたすべての費用を見るデータを本社にアップロードします.最後に本社は支払いに成功したマークを受け取ってから回転操作を行い、回転数はすべてのTテーブルのデータをCテーブルにコピーする.この機能を完了するには2つの方法があります.1つは、Cテーブルオブジェクトごとにset操作を直接行い、Tテーブルオブジェクトの対応する値を付与することです.テーブルが多い場合、この部分のコードは非常に多いので、取ることができません.もう1つは反射を利用して実現することである.反射を使用してオブジェクトのコピー操作を実現する方法を見てみましょう.
1、ソースオブジェクト
package com.reflectcopy.dto;

import java.io.Serializable;

/**
 *        T   
 * @author ibm
 *
 */
public class TModel implements Serializable
{
	private static final long serialVersionUID = 1L;
	private int id;
	private String name;
	private String pass;
	private String sex;
	public TModel(){}//                    
	public TModel(int id, String name, String pass, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
		this.sex = sex;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

2、目標オブジェクト
package com.reflectcopy.dto;

import java.io.Serializable;

/**
 *        C    
 * @author ibm
 *
 */
public class CModel implements Serializable{
	private static final long serialVersionUID = 1L;
	private int id;
	private String name;
	private String pass;
	private String sex;
	public CModel(){}//                    
	public CModel(int id, String name, String pass, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
		this.sex = sex;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

3、テストクラス
package com.reflectcopy.test;

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

import com.reflectcopy.dto.CModel;
import com.reflectcopy.dto.TModel;

public class ReflectCopyTest {
	public Object copy(Object sourceObject , Class targetObject) throws Exception {
		//        
		Class<?> sourceclassType = sourceObject.getClass();
		Class<?> targetclassType = targetObject;

		//                 
		Object objectCopy = targetclassType.getConstructor(new Class[] {}).newInstance();

		//          
		Field fields[] = targetclassType.getDeclaredFields();

		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			String fieldName = field.getName();
			if(!fieldName.equals("serialVersionUID")){//          
				String firstLetter = fieldName.substring(0, 1).toUpperCase();
				//         getXXX()     
				String getMethodName = "get" + firstLetter + fieldName.substring(1);
				//         setXXX()     
				String setMethodName = "set" + firstLetter + fieldName.substring(1);
				//         getXXX()  
				Method getMethod = sourceclassType.getMethod(getMethodName, new Class[] {});
				//         setXXX()  
				Method setMethod = targetclassType.getMethod(setMethodName, new Class[] { field.getType() });
				//       getXXX()  
				Object value = getMethod.invoke(sourceObject, new Object[] {});
				//        setXXX()  
				setMethod.invoke(objectCopy, new Object[] { value });
			}
		}
		return objectCopy;
	}

	public static void main(String[] args) throws Exception {
		TModel tModel = new TModel(1,"test","password"," ");
		CModel cModel = (CModel) new ReflectCopyTest().copy(tModel,CModel.class);
		System.out.println("Copy information:" + cModel.getId() + " " + cModel.getName() + " " + cModel.getPass() + " " + cModel.getSex());
	}
}

詳細については、以下を参照してください.http://www.16boke.com