2013-07-17 6 views
1

으로 downcasting : 자바 내가이 예와 비슷한 자바 1.6 모델을 하바 반사

public class Animal { 
    public String color; 
} 

public class Dog extends Animal { 
    public Float height; 
} 

public class Bird extends Animal { 
    public Integer wings; 
} 

은 지금은 누구의 아이에게 동물에서 캐스팅합니다. 나는 그것이 금지 된 캐스트에 대한 런타임 예외를 던진다는 것을 안다. 그래서 나는 부모 필드만을 가진 생성자와 자바 리플렉션의 도움으로 자식을 가질 수 있다고 생각합니다. 예 :

public class Animal { 
    public String color; 

    public Animal(Animal old){ 
    //Set all fields by reflection. but how! 
    } 
} 

public class Dog extends Animal { 
    public Float height; 

    public Dog (Animal old){ 
    super(old); 
    } 
} 

public class Bird extends Animal { 
    public Integer wings; 
    public Bird (Animal old){ 
    super(old); 
    } 
} 

어떻게 반사를 사용하여 모든 상위 필드를 설정합니까?

해결 방법 Thinaesh (https://stackoverflow.com/a/17697270/1474638) 감사합니다. 나는 다음 부모 생성자에서 할 필요가 있으므로 단지 스프링을 사용하고 있습니다 : 여기서하고있는 모든 값을 복사하는

: 귀하의 질문에 대한 코멘트를 통해 몇 가지 설명을받은 후

public Animal(Animal old){ 
    super(); 
    BeanUtils.copyProperties(old, this); 
} 

    public Dog(Animal old){ 
    super(old); 
} 

public Bird(Animal old){ 
    super(old); 
} 
+0

사이드 참고 :.. 당신이 그들을 필요하지 않은 경우, 대신 원시 래퍼의 사용 프리미티브는 것을 작동하도록되어 어떻게 – BackSlash

+1

객체 ? 필드가 없으므로 Dog에있는 필드를 Animal로 설정할 수 없습니다. – f1sh

+0

@ f1sh 자식 필드를 설정하고 싶지 않습니다. 부모 필드가 설정된 자식 객체가 필요합니다. 부모 필드에이 필드가 없으므로 children 필드는 null 값을 가져야합니다. – earnaz

답변

2

해보십시오 BeanUtils.copyProperties (봄의 BeanUtils 클래스에서 같은 일이 가능

+0

고마워요! 나는 당신의 해결책을 보여주기위한 질문을 편집했다.) – earnaz

0

클래스의 생성자. 반영 할 필요가 없습니다. 다른 방법이 없다면 반사는 피해야합니다. 아파치 평민 라이브러리에서

+0

예, 반성은 피해야하지만 내 질문은 반성과 함께 복사하는 방법입니다. – earnaz