1. 程式人生 > >反射小工具

反射小工具

declared rate tde cep 對象 generated args boolean flag

一、類的復制

  copyProperties(Object sourceObject,Object targetObject);

  ps:時間不夠了,這個很糙,很多情況都還沒有考慮。下次有時間了再好好寫一個

  

public void copyProperties(Object sourceObject,Object targetObject){
  /*
  * 首先獲取到傳遞過來的兩個類的Class對象
  */
  Class sourceClass = sourceObject.getClass();
  Class targetClass = targetObject.getClass();

  /*
  * 獲取到對象中的所有屬性
  * getFields()獲得某個類的所有的公共(public)的字段,包括父類。
  *  
  * getDeclaredFields()獲得某個類的所有申明的字段,即包括public、private和proteced,但是不包括父類的申明字段
  *
  * 在類中設置屬性的時候一般都是設置為private,所以這裏使用getDeclaredFields()方法
  */
  Field[] sourceFields = sourceClass.getDeclaredFields(); //註意,這個地方需要引入反射的包
  Field[] targetFields = targetClass.getDeclaredFields();

  /*
  * 獲取到類中的所有屬性時,就有兩種處理方法
  * 一、嵌套循環
  * 二、單個循環
  */
  boolean flag = true;
  if(flag) {
  //嵌套循環
  if(sourceFields != null && sourceFields.length >0){
    if(targetFields != null && targetFields.length > 0) {
      //如果類中有屬性,那麽嵌套循環
      for(Field sourceField : sourceFields) {
        for(Field targetField : targetFields) {
          //獲取到初始類的屬性名稱
          String sourceFieldName = sourceField.getName();
          Class sourceFieldType = sourceField.getType();
          //獲取到目標類的屬性名稱
          String targetFieldName = targetField.getName();
          Class targetFieldType = targetField.getType();
          //判斷類名是否一樣
          if(sourceFieldName.equals(targetFieldName) && sourceFieldType.equals(targetFieldType)) {
            //如果一樣,那麽就執行復制

            /**
            * 在復制這個地方,還有一個問題
            * 如果說目標的對象該屬性有值,那麽要不要重新賦值
            * 這個地方加一個判斷即可
            */
            String getMethodName = "get" + sourceFieldName.substring(0) + sourceFieldName.substring(1); //substring包左不包右
            String setMethodName = "set" + sourceFieldName.substring(0) + sourceFieldName.substring(1); //substring包左不包右


            try {
              //通過方法名稱獲取到類中的方法
              Method getMethod = sourceClass.getMethod(getMethodName);
              /*
              * 獲取到方法之後,直接執行
              * method.invoke(Object,args);
              * Object : 需要執行這個方法的對象
              * args : 參數
              */
              Object getMethodValue = getMethod.invoke(sourceObject);

              Method setMethod = targetClass.getMethod(setMethodName, targetFieldType);
              setMethod.invoke(targetObject, getMethodValue);
            } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            } //因為是getXxx()所以不需要
      }else {

  

      }
}
}
}else {
//如果該類中沒有屬性,那麽這個方法就沒有意義,直接返回
return;
}
}else {
//如果該類中沒有屬性,那麽這個方法就沒有意義,直接返回
return;
}
}else {
//單個循環
}
}

反射小工具