java reflect test

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

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;

import com.opensymphony.xwork2.ObjectFactory;

/**
 * Description: 通过反射将viewModel里的值为显示层viewModelForm赋值 <br>
 *
 * @author zhangqi
 * @time Dec 6, 2010 3:42:09 PM
 * @version
 */
public class ReflectViewModel {

 /**
  * 在这个类里面存在有copy()方法,根据指定的方法的参数去 构造一个新的对象的拷贝 并将他返回
  *
  * @throws NoSuchMethodException
  * @throws InvocationTargetException
  * @throws IllegalAccessException
  * @throws InstantiationException
  * @throws SecurityException
  * @throws IllegalArgumentException
  */

 public Object copy1(Object obj, List<FgJyptViewmodel> viewmodelList)
   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[] {});
  // 获得对象的所有属性
  Field[] fields = classType.getDeclaredFields();

  for (int i = 0; i < fields.length; i++) {
   // 获取数组中对应的属性
   Field field1 = fields[i];
   String fieldName = field1.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[] { field1.getType() });

   for (FgJyptViewmodel proxy : viewmodelList) {
    if (fieldName.equals(proxy.getViewValue())) {
     // 为可视模板设置是否选中属性
     setMethod.invoke(objectCopy, new Object[] { "true" });
    }
   }
  }
  return objectCopy;
 }

 

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[] {});

  // 获得对象的所有属性
  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 {
  test1();

 }

 private static void test1() throws InstantiationException,
   IllegalAccessException, InvocationTargetException,
   NoSuchMethodException {
  Customer customer = new Customer();
  customer.setName("hejianjie");
  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);
 }

 /*
  * test by me
  */
 private static void test2() throws InstantiationException,
   IllegalAccessException, InvocationTargetException,
   NoSuchMethodException {
  FgJyptViewmodel fgJyptViewmodel = new FgJyptViewmodel();
  FgJyptViewmodelForm fgJyptViewmodelForm = new FgJyptViewmodelForm();
  List<String> list = new ArrayList<String>();
  list.add("area");
  list.add("address");
  list.add("addresss");

  FgJyptViewmodelForm proxy = (FgJyptViewmodelForm) new ReflectTester()
    .copy2(fgJyptViewmodelForm, list);
  System.out.println(proxy.getArea());
  System.out.println(proxy.getAddress());
  System.out.println(proxy.getAuditState());
 }

}

class Customer {

 private Long id;

 private String name;

 private int age;

 public Customer() {

 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 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;
 }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值