継承ツリーのすべてのレベルがJavaBeansAPIをサポートしていることを確認してください。これで、次のような特定のレベルのクローン作成者を作成できます。
public <T> T specialClone( T obj, Class<T> type ) {
T result = type.newInstance();
Class<?> current = type;
while( current != null ) {
BeanInfo info = Introspector.getBeanInfo( current );
for( PropertyDescriptor pd: info.getPropertyDescriptors() ) {
Object value = pd.getReadMethod().invoke( obj );
pd.getWriteMethod().invoke( result, value );
}
current = current.getSuperClass();
}
return result;
}
メソッド呼び出しは同期されているため、読み取り/書き込みメソッドをキャッシュしたい場合があることに注意してください。
このようなことをするとき、私は通常、Beanを一度調べて、2つのメソッドをラップするヘルパーオブジェクトを作成するので、次のように作業できます。
for( Helper h : get( current ) ) {
h.copy( obj, result );
}
public Helper[] get( Class<?> type ) {
... look in cache. If nothing there, create helper using PropertyDescriptors.
}