2012-03-15 5 views
2

getConstructors() 메서드를 사용하여 클래스의 생성자를 가져옵니다. 클래스는 추상 수퍼 클래스 참조에 있으며 사용자가 결정할 때까지 어떤 하위 클래스가 호출되는지 알 수 없습니다. 여기 내가 지금까지 가지고있는 것이있다.생성자 배열에서 복사 생성자를 찾는 방법

Weapon stickCopy = stick; 
System.out.println(stick); 
System.out.println(stickCopy); 

Class <? extends Weapon> myClass = stick.getClass(); 

System.out.println(myClass.getSimpleName()); 

Constructor<?>[] construct = myClass.getConstructors(); 

for(Constructor<?> constructor: construct) 
{ 
    System.out.println(constructor); 
} 

try 
{ 
    stickCopy = (Weapon) construct[2].newInstance((stick)); 
} 
catch (Exception e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

System.out.println(stick); 
System.out.println(stickCopy); 

Stick 클래스는 추상 Weapon 클래스의 하위 클래스입니다. 플레이어 오브젝트에 저장되어있는 Weapon 레퍼런스의 딥 카피에 대한 코드를 알아 내려고하고 있습니다. 무기는 추상이기 때문에 복사 생성자를 호출 할 수 없습니다. 내 스틱 클래스에서는 복사 생성자가 세 번째 생성자이므로 try 문에서 생성 배열에 2를 하드 코딩했습니다. 예를 들어 복사 생성자 앞에 새로운 생성자를 추가하거나 순서를 변경하여 스틱 클래스의 생성자를 변경하면 런타임에 복사 생성자의 위치를 ​​어떻게 찾을 수 있습니까?

또한 제네릭을 사용 해 본 적이 없으므로, 일반적으로 좋은 프로그래밍 방법으로 간주되는 것을 따르지 않을 경우 수정하십시오.

+4

저는 이것을 반영하는 것이 좋은 생각인지 잘 모르겠습니다. 'Weapon' 클래스에'public abstract Weapon deepCopy()'메소드를 추가하는 것을 고려할 수 있습니다. 그러면 각 서브 클래스가 구현해야합니다. – biziclop

+0

@biziclop 나는 당신의 제안이 더 좋은 아이디어일지도 모른다고 생각하지만, 나는 그것을 어떻게 구현할 것인지 모른다. 스틱과 같은 임의의 하위 클래스를 보유하고있는 플레이어 클래스에 Weapon 속성이 있습니다. 내 getter를 작성하여 참조를 전달하는 대신 사본을 작성하고 싶습니다. 이게 그렇게 될까? '공용 무기 getWeapon() {return weapon.deepCopy(); }' – Gilbrilthor

+0

예, 그것이 제가 의미했던 것입니다. – biziclop

답변

5

the version of getConstructor that takes arguments을 사용하는 경우에는 해당 인수 유형별로 원하는 생성자를 지정할 수 있습니다. 아마도 당신은에 Stick.class 또는 Weapon.class 중 하나를 전달하려는 것 :

Constructor constructor = myClass.getConstructor(myClass); 
+1

매개 변수는 IIRC 배열이어야하지만 그렇지 않으면 가장 깨끗한 솔루션입니다. – Jochen

+0

@Jochen 그것은 이제 varargs, 행복한 일이야. – biziclop

+0

대단히 고마워요. 당신은 저에게 좋은 답변을 주셨습니다! – Gilbrilthor

2

Costructor.getParameterTypes()을 당신에게 유형의 생성자가 소요되는 매개 변수를 알려줍니다. 그래서 올바른 타입의 Object를 취하는 것을 확인하십시오.