複製可能なインターフェースを実装してみる
public class SomeType implements Cloneable {
private String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Object clone() {
try {
return super.clone();
} catch(CloneNotSupportedException e) {
System.out.println("Cloning not allowed.");
return this;
}
}
}
これをテストできます::
public class Test {
public static void main (String args[]) {
SomeType a = new SomeType();
SomeType b = (SomeType) a.clone();
if ( a == b ) {
System.out.println( "yes" );
} else {
System.out.println( "no" );
}
}
}
はい、オブジェクトの種類が異なる場合はリフレクションを試すことができますが、属性の名前は同じでなければならないことに注意してください
これがリフレクションを使用した答えです。このクラスを使用すると、メソッドと属性の名前が同じである限り、タイプに関係なく、あるオブジェクトから別のオブジェクトにすべてのパラメーターを渡すことができます。
package co.com;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class SetAttributes {
public static String capitalize( String word ) {
return Character.toUpperCase( word.charAt( 0 ) ) + word.substring( 1 );
}
public static void setAttributes( Object from, Object to ) {
Field [] fieldsFrom = from.getClass().getDeclaredFields();
Field [] fielsdTo = to.getClass().getDeclaredFields();
for (Field fieldFrom: fieldsFrom) {
for (Field fieldTo: fielsdTo) {
if ( fieldFrom.getName().equals( fieldTo.getName() ) ) {
try {
Method [] methodsTo = to.getClass().getDeclaredMethods();
for ( Method methodTo: methodsTo ) {
if ( methodTo.getName().equals( "set" + capitalize( capitalize( fieldTo.getName() ) ) ) ) {
Method methodFrom = from.getClass().getDeclaredMethod( "get" + capitalize( fieldFrom.getName() ), null );
methodTo.invoke(to, methodFrom.invoke( from, null ) );
break;
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
System.err.println( fieldFrom );
}
}
}
public static void main (String args[]) {
SomeType a = new SomeType();
SomeType b = new SomeType();
a.setA( "This" );
setAttributes( a, b );
System.err.println( b.getA() );
}
}