将属性从一个bean复制到另一个bean:Java

时间:2014-08-05 12:31:43

标签: java apache-commons-beanutils

我在将属性从一个bean复制到另一个bean时遇到了问题。

我知道copyProperties()可以在这里用来从源bean复制到目标bean,如果两个bean都是相同的类型。 我的问题是我想在第一次通话时复制前50个属性,在第二次通话时复制下50个属性。

我有什么方法可以复制前50个配置吗?

2 个答案:

答案 0 :(得分:1)

您只能使用reflection来执行此操作。

@Zhuinden提出了一个很好的开始。

要使该方法对任意类有用,请创建一个Map name -> field

Map<String,Field> asMap( Field[] fields ){
  Map<String,Field> m = new HashMap<String,Field>();
  for( Field f : fields ){
    f.setAccessible( true );
    m.put( f.getName(), f );
  }
  return m;
}

然后使用它:

Map<String,Field> trg = asMap( target.getClass().getDeclaredFields() );

int counter = 50;

for( Field f : Source.getClass().getDeclaredFields() ){
  f.setAccessible( true );
  Field fieldTarget = trg.get( f.getName() );
  if( null != fieldTarget ){
    fieldTarget.set(target, f.get(source));
    counter--;
  }
  if( 0 == counter ) break;
}

答案 1 :(得分:0)

这样的东西可以使用反射(根据https://stackoverflow.com/a/3738954/2413303在开头添加错误检查):

if(source.getClass() != target.getClass())
{
    throw new RuntimeException("The target and source classes don't match!");
}

Field[] fieldSources = source.getClass().getDeclaredFields();
Arrays.sort(fieldSources);
Field[] fieldTargets = target.getClass().getDeclaredFields();
Arrays.sort(fieldTargets);
//source and target class is the same so their fields length is the same

for(int i = 50*n; i < fieldSources.length && i < 50*n+50; i++)
{
    Field fieldSource = fieldSources[i];
    Field fieldTarget = fieldTargets[i];
    fieldSource.setAccessible(true);
    fieldTarget.setAccessible(true);
    fieldTarget.set(target, fieldSource.get(source));
}