2015-05-22 101 views

回答

0

「中投」他們普遍使用這樣的反射的唯一方法:

public static void copyObject(Object src, Object dest) 
     throws IllegalArgumentException, IllegalAccessException, 
     NoSuchFieldException, SecurityException { 
    for (Field field : src.getClass().getFields()) { 
     dest.getClass().getField(field.getName()).set(dest, field.get(src)); 
    } 
} 

例子:

static class ClassA { 
    public int a; 
    public String b; 
    public double c; 
} 

static class ClassB { 
    public int a; 
    public String b; 
    public double c; 
} 

public static void main(String[] args) throws Exception { 
    ClassA a = new ClassA(); 
    a.a = 1; 
    a.b = "test"; 
    a.c = 3.14; 

    ClassB b = new ClassB(); 
    copyObject(a, b); 
    System.out.println(b.a+", "+b.b+", "+b.c); // prints "1, test, 3.14" 
} 

但是,正如你可能已經猜到,這不是很好的辦法做Java的東西。

1

不,您不能將實例從一個類轉換爲另一個類,如果它們沒有任何關係。請查看Java Language Specification瞭解可能的演員表和轉換。

然而,您可以通過手動或使用框架(如Dozer)來複制屬性。

0

您可以創建一個Interface,該類別由兩個類實現以設置屬性。

這種方式,而不是鑄造您可以通過該接口引用它們

public interface PersonalInfo { 

    public void setName(String name); 
    public void setAge(int age); 

} 

然後你實現

public class ClassA implements PersonalInfo { 


String name; 
int age; 

//other things and methods 
@Override 
public void setName(String name) { 
    this.name = name; 
} 

@Override 
public void setAge(int age) { 
    this.age = age; 
} 

} 

而對於ClassB的

public class ClassB implements PersonalInfo { 

String name; 
int age; 

//other things and methods 

@Override 
public void setName(String name) { 
    this.name = name; 
} 

@Override 
public void setAge(int age) { 
    this.age = age; 
} 

} 
+0

我不確定他想要一個界面。他提到他們沒有任何關係。 –

+0

實現相同接口的對象之間沒有關係。兩者都是他們自己的獨立實現。他們只是遵循界面定義的協議。 – gtgaxiola

0

如果類不具有「是」關係(繼承),則不能轉換該類。在這種情況下,它必須逐個設置屬性。可能會將一種方法添加到其中一個類中進行變換。

public class ClassB { 
    private int num; 

    public int getNum() { 
     return num; 
    } 

    public void setNum(int num) { 
     this.num = num; 
    } 
    public ClassA transformToClassA(){ 
     ClassA obj= new ClassA(); 
     obj.setNum(this.num); 
     return obj; 
    } 
} 
0

不,你不能施放它們。你可以手動設置屬性(最好的方式)或者編寫某種類型的處理器來讀取類的定義,並設置相同名稱的字段中的字段 - 但這會非常脆弱,因爲如果你決定改變類A中某些屬性和類型的屬性將與類B中的屬性不兼容,您只能在運行時纔會發現它。如果您稍後決定將屬性添加到其中一個,而不是另一個,則會發生同樣的情況。你顯然可以設計一些防禦措施,但這意味着創建一個複雜的邏輯,而你可以簡單地手動設置屬性而不需要任何邏輯,並且可以進行編譯時檢查。

相關問題