我在将属性从一个bean复制到另一个bean时遇到了问题。
我知道copyProperties()
可以在这里用来从源bean复制到目标bean,如果两个bean都是相同的类型。
我的问题是我想在第一次通话时复制前50个属性,在第二次通话时复制下50个属性。
我有什么方法可以复制前50个配置吗?
答案 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));
}