2015-05-22 81 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中的属性不兼容,您只能在运行时才会发现它。如果您稍后决定将属性添加到其中一个,而不是另一个,则会发生同样的情况。你显然可以设计一些防御措施,但这意味着创建一个复杂的逻辑,而你可以简单地手动设置属性而不需要任何逻辑,并且可以进行编译时检查。

相关问题